У меня есть Perl-скрипт, который выполняет fork/exec для запуска другого инструмента в фоновом режиме и отслеживания некоторых изменений файловой системы во время работы этого другого инструмента. Кажется, это работает так, как ожидалось.
Когда я запускаю этот Perl-скрипт из оболочки (например, Bash), конечно, приглашение оболочки должно отсутствовать, пока работает мой Perl-скрипт. И он будет работать до тех пор, пока не произойдет ожидаемая модификация файла; но нет гарантии, что модификация файла может быть выполнена внешним инструментом, в этом случае внешний инструмент завершит работу, но мой скрипт будет продолжать работать и должен каким-то образом обрабатывать эту ситуацию - эта обработка выходит за рамки вопроса и к моей проблеме отношения не имеет (пока это даже не реализовано).
Моя проблема в том, что как только мой дочерний процесс умирает, Bash возвращается к своей подсказке, утверждая, что мой процесс завершен... что не соответствует действительности. Очевидно, что он все еще работает в фоновом режиме и ожидает модификации файловой системы. Если я продолжаю печатать какой-либо текст в основном цикле скрипта, этот текст все равно печатается, даже если bash уже вернулся к приглашению.
Я не могу понять, что заставляет bash считать, что мой процесс завершился. Я пытался заблокировать сигнал SIGCHLD в своем скрипте, я пытался закрыть и/или перенаправить STDOUT/STDERR/STDIN (которые дублируются на форке, но кто знает) - безуспешно. Я даже попробовал знаменитую «двойную вилку», чтобы сделать конечный дочерний элемент независимым от моего скриптового процесса, и результат тот же. Что бы я ни делал, как только мой ребенок (или внук) умирает, Баш считает, что мой процесс остановился. Запуск моего сценария в фоновом режиме (используя «&» в конце) заставляет Bash даже сказать мне, что процесс XYZ завершен (и он называет здесь мой процесс, а не дочерний процесс, хотя мой процесс счастливо жив и печатает на терминал через STDOUT в тот же момент).
Если бы это была проблема только с Bash, мне было бы все равно, но другое стороннее программное обеспечение, которое должно запускать мой скрипт, действует так же. Как только мой ребенок умирает, они утверждают, что мой сценарий на самом деле умер, что просто не соответствует действительности.