Скрипт Bash порождает не дочерние процессы cat - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть простой скрипт 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 голосов
/ 04 сентября 2018

Попробуйте убить группу процессов скрипта, а не только процесс-лидер. Вы можете сделать это, отправив сигнал на отрицательный идентификатор группы процессов. Идентификатор группы процессов - это идентификатор процесса-лидера, поэтому ваш kill просто становится

kill -KILL -$pid

Подробнее о kill и идентификаторах групп процессов на справочной странице kill .

...