一个关于僵死进程处理的问题

41 天前
cosmain  cosmain

比如一个脚本 generator.sh

#!/bin/bash

echo "1.1.1.1"
echo "1.0.0.1"

sleep 3600

再执行下面命令

./generator.sh | xargs -n 1 -d'\n' -P 10 -I THE_IP ping THE_IP -c 1 > /dev/null &

这时候出现的情况就是,ping 都会成为僵尸进程,怎么修改脚本避免出现僵尸进程?

1419 次点击
所在节点   Linux  Linux
9 条回复
zwzwzwzwzxt
zwzwzwzwzxt
41 天前
用 sh -c 包一层。

```
./generator.sh | xargs -n 1 -d'\n' -P 10 -I THE_IP sh -c 'ping THE_IP -c 1' > /dev/null &
```
2owe
2owe
41 天前
double fork
gesse
gesse
41 天前
按理说,xargs 应该会妥善处理 zombie 的问题的。
ho121
ho121
41 天前
把 sleep 去掉
cosmain
cosmain
40 天前
@ho121
去掉就不是本来的意思了。
ho121
ho121
40 天前
@cosmain sleep 的存在,造成 shell 没有及时退出,进而造成 xargs 不及时退出,进而造成 xargs 没有及时回收子进程。
cosmain
cosmain
40 天前
@ho121
僵尸进程的形成,并不是因为父进程没有退出。
tomychen
tomychen
36 天前
trap 'wait' SIGCHLD 这样应该能解了吧?
cosmain
cosmain
36 天前
@tomychen
@ho121

发现其实是 xargs 是单线程的,如果“|”管道的前段 sleep 没有写入信息和结束,xargs 就一直 block 在读这个系统调用,无暇执行 wait

如果前面改成
```
#!/bin/bash
while true
do
echo "1.1.1.1"
sleep 2
done
```

你就会发现每次循环,后面的 xargs 都会把上一轮的 ping 的僵尸进程 wait 掉。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1096780

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX