У меня есть сценарий 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
или его эквивалент, так как может быть запущено несколько экземпляров, и я хочу убить только конкретный экземпляр.