Сценарій Bash повинен вбивати лише ті екземпляри іншого сценарію, який він запустив


11

У поточній ситуації певний скрипт 'call.sh' запускає інший скрипт 'call.sh' у фоновому режимі, виконує інші операції, деякий час спить, а потім припиняє 'call.sh' з a pkill called.sh. Це чудово працює.

Тоді я також хотів би запустити "call.sh" з інших терміналів як окремий сценарій в будь-який інший час, перед тим чи після запуску call.sh. Ці незалежні екземпляри не повинні вбиватися "call.sh".

Як я можу цього досягти? Інтуїція говорить про те, що сценарій виклику повинен бути в змозі повідомити процес, який він розпочав, з будь-якого іншого імені, який тим часом працює.

Як варіант, 'call.sh' також може запустити 'call', що є символічним посиланням на 'call.sh'. Чи ускладнює це управління вищевказаною ситуацією? Які конкретні застереження та коригування вимагає використання символічного посилання?


1
Я вважаю, що неподілитись
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
Це повинно працювати до тих пір, поки покликаний.sh не вмирає сам по собі, оскільки в іншому випадку його pid може бути повторно використаний, в результаті чого в результаті невинного і не пов'язаного між собою процесу.
Євген Рябцев

2
@EugeneRyabtsev - це дуже хороший момент. Я думаю, ви також можете перевірити, чи є $calledPidбатьківський PID PID called.sh.
terdon

Щоб підтвердити відповідь, це ще один ресурс, який мені здався
XavierStuvw

18

Мені довелося вибирати це, але зі сценаріїв стільки разів; ще веселіше, коли сценарії викликаються як складна складна автоматизована програма. Ви дійсно не повинні покладатися на щось на зразок pkillвибору, який сценарій вбити.

Всередині call.sh слід записати PID-адреси запущених завдань та вбити їх явно PID.

Всередині call.sh:

./called.sh &
called_pid=$!

# Later
kill $called_pid
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.