Завершить дочерний процесс, как только родительский процесс оболочки рыбы завершится? - PullRequest
0 голосов
/ 22 февраля 2019

Я порождаю оболочку fish в качестве фонового задания и из нее я порождаю inotifywait (процесс, который просматривает указанный файл и возвращает его только после его изменения).

Позже, однако, в неуказанный момент времени (в этот момент не гарантируется, что inotifywait вернулся), я убиваю оболочку fish, которая породила inotifywait.

Моя цель - чтобы inotifywait автоматически завершился, как только PPID, который его породил, завершится.Есть ли способ сделать это?

fish -c "inotifywait -qq $somefile && ..." &
# time passes, inotifywait hasn't returned
kill -15 (jobs -lp)
# the fish process is now terminated, but inoyifywait remains

Временный хак, который я сейчас использую, состоит в том, чтобы просто обновить время доступа просматриваемого файла (с помощью такой утилиты, как touch), чтобыinotifywait наконец вернется.

Я использую рыбу 3.0.1 на Linux 4.20.11.

1 Ответ

0 голосов
/ 22 февраля 2019

Не используйте рыбу в любых ситуациях, когда ожидается нормальная семантика контроля работы.Рыба - лучшая интерактивная оболочка, которую я когда-либо использовал.Это была моя основная оболочка для входа в систему в течение нескольких лет.Но это управление работой было нарушено вплоть до первой версии.Для забавы сделайте следующее:

fish -c 'trap "echo WTF; exit 3" TERM; sleep 666' &
kill (jobs -lp)

Вы не увидите сообщение "WTF", а фоновая раковина рыбы не прекратит работу.Теперь ps waux | grep sleep и убейте процесс сна.Вы должны увидеть сообщение «WTF» на своем терминале, и ваша интерактивная оболочка сообщит, что фоновая рыба завершилась.

Для ситуаций такого типа самое простое решение - просто использовать bash / ksh / sh для фонового сценария..

...