杀死BASH的孩子看起来很容易。 但我的脚本让孩子在UNIX传送带内。 而这种标准技术不起作用。
我有像这样的BASH脚本
ls -1 | { while read line ; do
python -c 'while 1: pass' &
done ; }
while : ; do sleep 1 ; done
父进程应等待Ctrl + C或其他信号停止所有后台 子进程做无限循环。
有问题:
jobs -p # print nothing so trap hook cannot kill anybody
其次是花括号内定义的陷阱根本不被调用。 在这种情况下,无限循环也在括号内。
我有一个最后的解决方案来放置来自$的pids!进入tmp文件但是 对我来说看起来很麻烦。
我已经使用下面的新建议重写了代码,但仍然没有成功。
#!/bin/bash
echo "my pid is $$"
exit_func() {
echo "pid in exit $(echo $$)"
echo "ps $(ps --no-headers --ppid $$ -o pid)"
echo "pgrep $(pgrep -P $$)"
echo "pstree $(pstree -p $$)"
}
trap 'exit_func' EXIT
ls -1 / | {
while read a ; do
python -c 'while 1: pass' &
echo -n " $!"
done
}
while : ; do : ; done
Util ps,pgrep和pstree都看不到python孩子。
[dan@localhost]$ ./testtrap.sh
my pid is 17848
17851 17852 17853 17854 17855 17856 17857 17858 17859 17860 17861 17862 17863 17864 17865 17866 17867 17868 17869 17870 17871 17872 17873 C-c C-\
cpid in exit 17848
ps 17875
pgrep 17877
pstree testtrap.sh(17848)---testtrap.sh(17879)---pstree(17880)
[dan@localhost]$ ps
PID TTY TIME CMD
17851 pts/2 00:00:12 python
17852 pts/2 00:00:12 python
17853 pts/2 00:00:12 python
17854 pts/2 00:00:12 python
17855 pts/2 00:00:12 python
17856 pts/2 00:00:14 python
17857 pts/2 00:00:12 python
17858 pts/2 00:00:15 python
17859 pts/2 00:00:12 python
17860 pts/2 00:00:12 python
17861 pts/2 00:00:15 python
17862 pts/2 00:00:12 python
17863 pts/2 00:00:12 python
17864 pts/2 00:00:12 python
17865 pts/2 00:00:12 python
17866 pts/2 00:00:14 python
17867 pts/2 00:00:12 python
17868 pts/2 00:00:12 python
17869 pts/2 00:00:12 python
17870 pts/2 00:00:15 python
17871 pts/2 00:00:12 python
17872 pts/2 00:00:12 python
17873 pts/2 00:00:12 python
17959 pts/2 00:00:00 ps
27560 pts/2 00:00:00 bash
[dan@localhost]$