Скрипт Bash должен убивать только те экземпляры другого скрипта, которые он запустил

11

В текущей ситуации определенный сценарий call.sh запускает другой фоновый файл named.sh в фоновом режиме, выполняет другие операции, некоторое время бездействует, а затем завершает вызов файла named.sh с помощью a pkill called.sh. Это отлично работает.

Затем, я также хотел бы запустить 'named.sh' из других терминалов в качестве отдельного скрипта в любое другое время, до или после запуска call.sh. Эти независимые экземпляры не должны быть уничтожены с помощью call.sh.

Как мне этого добиться? Интуиция говорит, что вызывающий скрипт должен иметь возможность сообщать процесс, который он запустил, от любых других однофамильцев, работающих в это время.

Как вариант, call.sh может также запускать колл, который является символической ссылкой на колл. Это усложняет управление вышеуказанной ситуацией? Какие конкретные предостережения и корректировки требует использование символической ссылки?

XavierStuvw
источник
1
Я считаю, что unshare специально для этого: unix.stackexchange.com/a/450242/323121
Rusi

Ответы:

27

Не используйте имя, чтобы убить его. Поскольку calling.shскрипт вызывает процесс, который вы позже хотите уничтожить, просто используйте $!(from man bash):

! Расширяется до идентификатора процесса задания, которое в последний раз помещается в фоновом режиме, независимо от того, выполняется ли оно как асинхронная команда или с использованием bgвстроенной функции.

Итак, если вы calling.shтакой:

called.sh &
## do stuff
pkill called.sh

Измените это на это:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"
Тердон
источник
4
Это должно работать до тех пор, пока call.sh не умрет сам по себе, потому что в противном случае его pid может быть использован повторно, что приведет к гибели невинного и не связанного с этим процесса.
Евгений Рябцев
2
@ ЕвгенийРябцев, это очень хороший момент. Я думаю, вы также можете проверить, что $calledPidродительский PID является PID для called.sh.
Terdon
Чтобы подкрепить ответ, это еще один ресурс, который я нашел полезным для организации своих мыслей: mywiki.wooledge.org/ProcessManagement
XavierStuvw
18

Я должен был выбрать это, но из сценариев так много раз; Еще интереснее, когда скрипты вызываются как часть сложного автоматизированного расписания. Вы действительно не должны полагаться на что-то вроде pkillвыбора сценария для уничтожения.

Внутри call.sh вы должны записать PID заданий, которые вы запустили, и уничтожить их явно с помощью PID.

Внутри call.sh:

./called.sh &
called_pid=$!

# Later
kill $called_pid
Филип Коуллинг
источник