美文网首页
docker,孤儿进程和僵尸进程

docker,孤儿进程和僵尸进程

作者: 高稚商de菌 | 来源:发表于2019-07-05 20:55 被阅读0次

在docker里,使用selenium启动chrome做截图的时候,webdriver quit后,会产生很多僵尸进程。

def screenshot(url):
        current_path = os.path.join(os.path.dirname(__file__))  # 文件的暂存路径
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        browser_exe_path = os.path.join(current_path, "chromedriver")
        browser = webdriver.Chrome(executable_path=browser_exe_path,
                                   chrome_options=chrome_options)
        browser.get(url)
        time.sleep(5)
        size = browser.find_element_by_xpath("//main").size
        browser.set_window_size(1200, size.get("height"))
        pic_path = os.path.join(current_path, "screenshot.png")
        browser.save_screenshot(pic_path)
        browser.quit()

在调查了进程树之后,终于发现:chromedriver fork出了多个子进程和一个孙进程,而调用quit后,chrome driver正常退出,而它的子孙们变成了孤儿进程,被托管给了docker的1号进程,也就是docker的启动进程。这些孤儿进程退出后,根据孤儿进程托管的优先级,最终由1号进程托管,而1号进程没有处理(wait/waitpid),这些进程就变成了僵尸进程。

但是!!!这个1号进程和宿主机的init进程有着本质的区别,这个1号进程,并没有能力处理子进程退出的信号,所以导致僵尸进程没有人“收尸”。

僵尸进程是kill不掉的。最终,解决办法是,在1号进程加了一行代码:

signal.signal(signal.SIGCLD, signal.SIG_IGN)

在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN,这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。

参考: https://yq.aliyun.com/articles/61894

相关文章

  • docker,孤儿进程和僵尸进程

    在docker里,使用selenium启动chrome做截图的时候,webdriver quit后,会产生很多僵尸...

  • 孤儿进程、僵尸进程与进程回收

    孤儿进程与僵尸进程 孤儿进程:父亲死了,子进程被init进程领养僵尸进程:子进程死了,父进程没有回收子进程的资源(...

  • 孤儿进程与僵尸进程

    孤儿进程与僵尸进程[总结] 1、前言 之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直...

  • 僵尸进程&孤儿进程

    僵尸进程概念 孤儿进程概念

  • 示例说明僵尸进程的危害及解决方法

    简述 首先简要说明下僵尸进程和孤儿进程的概念(前提都是父进程调用fork产生子进程) 僵尸进程:子进程终止,父进程...

  • 僵尸进程和孤儿进程

    详情参考https://www.cnblogs.com/Anker/p/3271773.html 我们知道在uni...

  • 孤儿进程和僵尸进程

    1.孤儿进程 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进...

  • 孤儿进程和僵尸进程

    孤儿进程 父进程退出,它的子进程就会成为孤儿进程,所有的孤儿进程都会被init接管,释放它们占用的系统资源。孤儿进...

  • 孤儿进程和僵尸进程

    基本概念 在unix/linux中,正常情况下,子进程是通过父进程创建,子进程再创建新的进程。子进程的结束和父进程...

  • Linux中的僵尸进程和孤儿进程

    Linux中的僵尸进程和孤儿进程 孤儿进程 孤儿进程指的一个父进程退出,而它的一个或多个子进程还在运行,那么那些子...

网友评论

      本文标题:docker,孤儿进程和僵尸进程

      本文链接:https://www.haomeiwen.com/subject/fgjyhctx.html