Bash脚本生成的不是Cat的子进程

时间:2018-09-04 09:56:47

标签: linux bash shell process cat

我有一个简单的bash脚本,它仅将sevice的输出重定向到文件:

#!/bin/sh

SERIAL_LOCK=/tmp/serial.lock

if [ -f $SERIAL_LOCK ]
    then
    read pid < $SERIAL_LOCK
    echo "kill previous serial logger with pid $pid"
    kill $pid
fi

echo $$ > $SERIAL_LOCK

echo "starting with $$ ..."

cat -s /dev/ttyUSB0 > /serial.log

echo "serial logger $$ stopped"

多次调用此脚本后,kill命令会杀死脚本实例,但是每次调用此脚本后,cat进程都不会被终止,例如:

 ps aux | grep cat
root      5417  0.0  0.0   4304   304 pts/0    S    09:45   0:00 cat -s /dev/ttyUSB0
root      5425  0.0  0.0   4304   344 pts/0    S    09:45   0:00 cat -s /dev/ttyUSB0
root      5434  0.0  0.0   4304   304 pts/0    S    09:45   0:00 cat -s /dev/ttyUSB0
root      5437  0.0  0.0   4304   336 pts/0    S    09:45   0:00 cat -s /dev/ttyUSB0

 ps aux | grep serial
root      5435  1.2  0.5   5008  2580 pts/0    S    09:45   0:00 /bin/sh /usr/sbin/serial_log.sh

为什么杀死脚本不会导致该脚本运行的cat进程被杀死,我如何使其工作像预期的那样:仅一个实例f脚本和cat命令同时运行?

1 个答案:

答案 0 :(得分:1)

尝试杀死脚本的进程组,而不只是杀死引导进程。您可以通过将信号发送到否定的进程组ID来实现。流程组ID是潜在客户流程的流程ID,因此您的kill就变成了

kill -KILL -$pid

有关killthe kill man page上的进程组ID的更多信息。