У меня есть сценарий Cygwin bash, который мне нужно смотреть и завершать при определенных условиях - в частности, после создания определенного файла. Однако мне сложно понять, как именно завершить скрипт с тем же уровнем полноты, что и Ctrl + C.
Вот простой сценарий (называемый test1
), который делает немного больше, чем просто ожидает завершения.
#!/bin/bash
test -f kill_me && rm kill_me
touch kill_me
tail -f kill_me
Если этот сценарий запускается на переднем плане, Ctrl + C завершит как tail
, так и сам сценарий. Если сценарий выполняется в фоновом режиме, kill %1
(при условии, что это задание 1) также завершает работу как tail
, так и сценария.
Однако, когда я пытаюсь сделать то же самое из сценария, я обнаруживаю, что только процесс bash
, запускающий сценарий, завершается, а tail
остается без связи со своим родителем. Вот один из способов, который я пробовал (test2
):
#!/bin/bash
test -f kill_me && rm kill_me
(
touch kill_me
tail -f kill_me
) &
while true; do
sleep 1
test -f kill_me && {
kill %1
exit
}
done
Если это запущено, подоболочка bash, работающая в фоновом режиме, завершается нормально, но tail
все еще остается.
Если я использую явно отдельный сценарий, например этот, он все равно не работает (test3
):
#!/bin/bash
test -f kill_me && rm kill_me
# assuming test1 above is included in the same directory
./test1 &
while true; do
sleep 1
test -f kill_me && {
kill %1
exit
}
done
tail
все еще висит после запуска этого сценария.
В моем фактическом случае процесс создания файлов не особенно инструментален, поэтому я не могу заставить его завершиться самостоятельно; тем не менее, узнав, когда был создан конкретный файл, я могу понять, что его можно прекратить. К сожалению, я не могу использовать простой killall
или эквивалент, так как может быть запущено несколько экземпляров, и я хочу убить только конкретный экземпляр.