зачем вам нужен процесс tail
?
Не могли бы вы вместо этого сделать что-то вроде
./test.sh | while read line; do
# process $line
done
или, если вы хотите сохранить вывод в tmp.txt:
./test.sh | tee tmp.txt | while read line; do
# process $line
done
Если вы все еще хотите использовать промежуточный процесс tail -f
, возможно, вы могли бы использовать именованный канал (fifo) вместо обычного канала, чтобы позволить отсоединить процесс tail
и получить егоpid:
./test.sh >tmp.txt &
PID=$!
mkfifo tmp.fifo
tail -f tmp.txt >tmp.fifo &
PID_OF_TAIL=$!
while read line; do
# process $line
kill -0 ${PID} >/dev/null || kill ${PID_OF_TAIL}
done <tmp.fifo
rm tmp.fifo
Однако следует отметить, что такое решение представляет несколько серьезных проблем состояния гонки:
- PID
test.sh
может быть повторно использован другим процессом; - , если процесс
test.sh
все еще жив, когда вы читаете последнюю строку, у вас не будет другого случая обнаружить его смерть впоследствии, и ваш цикл будет зависать.