Не следует избегать PID.Они являются идентификаторами процессов и предназначены для использования.
Bash автоматически отслеживает дочерние процессы, которые он запускает.Самый последний идентификатор фонового процесса поддерживается в $ !.Bash также поддерживает элементы управления заданиями, используя синтаксис «% n».
Вы можете отследить изменения статуса дочерних процессов с помощью ловушки SIGCHLD, и вы можете «ждать», пока один или все дочерние процессы завершатся с помощью команды ожидания.Мониторинг процесса, который состоит из запускаемых «job1» и «job2» в примере сценария:
job1 & # start job1 in background
j1pid=$! # get its process id
job2 & # start job2 in background
j2pid=$1 # get its process id
trap 'err=1' ERR # trap all errors
err=
wait $j1pid # wait for job1 to complete
# at this point job1 could have completed normally,
# or either process could have had an error
trap - ERR # revert to "normal" handling of most errors
# kill the processes nicely, or abruptly
# kill -TERM sends the TERM signal to the process, which it can trap
# and do whatever pre-exit process is needed.
# kill -9 cannot be trapped.
for pid in $j1pid $j2pid ; do
kill -TERM $pid 2>/dev/null || kill -9 $pid
done