一、僵尸进程问题
snapshot-consumer | selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.snapshot-consumer | (unknown error: DevToolsActivePort file doesn't exist)snapshot-consumer | (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)snapshot-consumer | Stacktrace:
二、原因分析
-
传递退出信号,确保子进程正确退出
-
wait子进程退出,回收僵尸进程
三、解决办法
3.1、脚本内部加入信号处理的方法
参照:
Python模块之信号(signal) - 每天进步一点点!!! - 博客园 (cnblogs.com) (7条消息) Python Signal(信号) 异步系统事件_jhonguy的博客-CSDN博客singnal.signal(signalnum, handler)参数:
signalnum为某个信号, handler为该信号的处理函数。我们在信号基础里提到,进程可以无视信号,可以采取默认操作,还可以自定义操作。当handler为signal.SIG_IGN时,信号被无视(ignore)。当handler为singal.SIG_DFL,进程采取默认操作(default)。当handler为一个函数名时,进程采取函数中定义的操作。
# python3
# 开头加入如下代码,告诉此进程 SIGCLD的信号用SIG_IGN方法处理
import signal
signal.signal(signal.SIGCLD, signal.SIG_IGN)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
chrome_options = webdriver.ChromeOptions() # 或者 chrome_options = Options()
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) # 防止反爬
chrome_options.add_argument('--disable-blink-features=AutomationControlled') # 避免webdriver检测
chrome_options.add_argument("--remote-debugging-port=9222") # 解决报错 WebDriverException: Message: unknown error: DevToolsActivePort file doesn't exist
chrome_options.add_argument('--no-sandbox') # 直接把sandbox禁用了,–-no-sandbox参数是让Chrome在root权限下跑
chrome_options.add_argument('--disable-dev-shm-usage') # 大量渲染时候写入/tmp而非/dev/shm
chrome_options.add_argument('--headless') # 无头模式,传递此参数浏览器不会显示界面,程序在后台运行
hrome_options.add_argument('--disable-gpu') # 禁用GPU加速
chrome_options.add_argument("user-agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'") # 模拟浏览器
# chrome_options.add_argument('--proxy-server=http://127.0.0.1:10809') # 利用v2ray配置代理
driver = webdriver.Chrome(options=chrome_options, service=Service('/usr/local/bin/chromedriver'))
# driver.set_page_load_timeout(300)
driver.maximize_window() # 仅仅适配到当前显示屏大小,数据偶尔还是不完整,需要下滑鼠标
try:
driver.get("https://www.163.com")
except Exception as e:
print(e)
else:
content = driver.page_source.encode('utf-8') # 获取页面响应数据
print content
finally:
driver.quit()
3.2、dumb_init
-
防止产生僵尸进程的dumb-init程序
-
dumb-init:一个Docker容器初始化系统_语言 & 开发_金灵杰_InfoQ精选文章
# It's a good idea to use dumb-init to help prevent zombie chrome processes.
ADD https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64 /usr/local/bin/dumb-init
RUN chmod +x /usr/local/bin/dumb-init
docker run my_container dumb-init python -c 'while True: pass'
3.3、docker运行时加入--init参数
docker run -it --init -v /home/blackip:/home/blackips/ selenium:1.0 python3 linux_black_ip.py
3.4、其他解决办法参考
-
一次 Docker 容器内大量僵尸进程排查分析 - 番茄系统家园 (nndssk.com)
-
node.js - Kubernetes equivalent of `docker run --init` - Stack Overflow
四、参考
docker,防止产生孤儿进程和僵尸进程 - 简书 (jianshu.com)
(6条消息) 爬虫服务(chromedp)僵尸进程排查记录_chromedp 僵尸进程_liyunlong41的博客-CSDN博客文章来源:https://www.toymoban.com/news/detail-423619.html
dumb-init:一个Docker容器初始化系统_语言 & 开发_金灵杰_InfoQ精选文章文章来源地址https://www.toymoban.com/news/detail-423619.html
到了这里,关于解决 Docker + selenium + chromedriver + chrome 会出现僵尸进程的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!