.net父进程被终止时,自动终止子进程

 

做过selenium爬虫的人,一定有一个烦恼,那就是selenium会启动很多子进程,爬虫终止的时候,由于各种原因,总会有些僵尸进程(chrome,chromedriver)残留在内存,不清除这些僵尸就无法进行大规模的爬行。

在网上搜索了半天,终于发现一个有用的文章

https://gist.github.com/valantonini/452cf90254e50617f6273bab8c34b1dc

这个程序就是调用windows的api,把主进程和子进程捆绑成一个job,杀死主进程就杀死子进程,这个叫同生共死,终于可以和僵尸拜拜了。

我把这个稍微封装下,加了获取子进程树和去重复的功能

        public static Job m_job = new Job();
        private static HashSet<int> childrenPid = new HashSet<int>();

        public static void AddChildrenProcess(int pid)
        {
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
            ManagementObjectCollection moc = searcher.Get();
            foreach (ManagementObject mo in moc)
            {
                AddChildrenProcess(Convert.ToInt32(mo["ProcessID"]));
            }

            if( !childrenPid.Contains(pid))
            {
                m_job.AddProcess(pid);
                childrenPid.Add(pid);
            }
        }

 调用方法如下,注意,一定要在new ChromeDeriver后调用,在new之前调用的哈,由于还没有启动driver,ProcessId为空会导致调用失败。

                m_chromeDriverService = ChromeDriverService.CreateDefaultService(System.Environment.CurrentDirectory);

...

            m_driver = new ChromeDriver(m_chromeDriverService, options, TimeSpan.FromSeconds(180));

            AddChildrenProcess(m_chromeDriverService.ProcessId);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值