我有一个简单的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命令同时运行?
答案 0 :(得分:1)
尝试杀死脚本的进程组,而不只是杀死引导进程。您可以通过将信号发送到否定的进程组ID来实现。流程组ID是潜在客户流程的流程ID,因此您的kill
就变成了
kill -KILL -$pid
有关kill
和the kill
man page上的进程组ID的更多信息。