比如一个脚本 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 10 天前
用 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 10 天前
double fork
|
3
gesse 10 天前
按理说,xargs 应该会妥善处理 zombie 的问题的。
|
4
ho121 10 天前 via Android
把 sleep 去掉
|
8
tomychen 5 天前
trap 'wait' SIGCHLD 这样应该能解了吧?
|