
比如一个脚本 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 都会成为僵尸进程,怎么修改脚本避免出现僵尸进程?
发现其实是 xargs 是单线程的,如果“|”管道的前段 sleep 没有写入信息和结束,xargs 就一直 block 在读这个系统调用,无暇执行 wait
如果前面改成
#!/bin/bash while true do echo "1.1.1.1" sleep 2 done 你就会发现每次循环,后面的 xargs 都会把上一轮的 ping 的僵尸进程 wait 掉。
1 zwzwzwzwzxt 2024-12-11 18:07:58 +08:00 用 sh -c 包一层。 ``` ./generator.sh | xargs -n 1 -d'\n' -P 10 -I THE_IP sh -c 'ping THE_IP -c 1' > /dev/null & ``` |
2 2owe 2024-12-11 18:09:47 +08:00 double fork |
3 gesse 2024-12-11 20:59:13 +08:00 按理说,xargs 应该会妥善处理 zombie 的问题的。 |
4 ho121 2024-12-11 21:34:40 +08:00 via Android 把 sleep 去掉 |
6 ho121 2024-12-12 10:10:42 +08:00 @cosmain sleep 的存在,造成 shell 没有及时退出,进而造成 xargs 不及时退出,进而造成 xargs 没有及时回收子进程。 |
8 tomychen 2024-12-16 14:07:34 +08:00 trap 'wait' SIGCHLD 这样应该能解了吧? |