#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.