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