управление сценариями bash породило процессы

#bash #unix #process

#bash #unix #процесс

Вопрос:

Я использую подобный скрипт для внешнего управления stdin и stdout очень длительных процессов:

 #!/bin/sh
touch process.stdin
tail -fn0 process.stdin | my_process > process.stdout
  

Это работает нормально, за исключением случаев, когда my_process завершает работу, конечный процесс не завершается. Есть ли способ заставить хвост завершиться при завершении my_process?

В качестве альтернативы, есть ли лучший способ настроить это?

Комментарии:

1. Из man tail : --pid=PID with -f, terminate after process ID, PID dies . Если вы знаете pid …?

2. Как я мог бы получить pid my_process, но при этом иметь возможность передавать к нему?

3. Как бы то ни было, я пробовал с --pid=$$ и exec my_process , но не имел большого успеха.

4. чего вы хотите достичь? что делает my_process, это скрипт? это зависит, но, возможно, создание именованного канала может упростить его.

5. Вы хотите следовать PID процесса, в который выполняется запись process.stdin .

Ответ №1:

На самом деле вы формулируете здесь: продолжайте (-f) отображать последние нулевые строки (-n0) этого постоянно растущего файла и запихивайте его в my_process. Хотя my_process завершал работу, кажется, что флаг -f предотвращает выход tail.

Чтобы закончить все красиво и уверенно простым способом, вы могли бы попытаться завершить tail изнутри его дочерней my_program при выходе: kill -SIGTERM $PPID

или даже очень аккуратным способом: trap "kill -SIGTERM $PPID" EXIT

если my_process не является сценарием оболочки bash, попробуйте это:

tail -f process.stdin | ( my_process > process.stdout ; kill -SIGTERM $PPID )

Я предполагаю, что вы пытаетесь выполнить передачу из файла журнала. Вы могли бы в качестве альтернативы подключить выполнение my_process к rsyslog или использовать inotifywait.