Я пытаюсь написать надежный сценарий bash, и в нем я создаю фоновый процесс. В конце сценария я хочу его убить. У меня это PID.
Я думал о чем-то вроде этого
while [[ ps ef $PID ]] ; do
kill $PID
sleep 0.5
done
Есть ли что-нибудь лучшее? Возможные проблемы с этим подходом?
Проблема с многократным завершением процесса заключается в том, что у вас есть состояние гонки при создании нового процесса. Это маловероятно, но возможно, что процесс завершится и новый процесс запустится с тем же PID, пока вы спите.
Почему вам нужно постоянно убивать процесс? Если это связано с тем, что процесс завершится, но после получения сигнала может потребоваться некоторое время, чтобы завершить работу, вы можете использовать wait
:
kill $PID
wait $PID
В идеальной системе вам никогда не придется повторять kill
или выпуск kill -9 $PID
. Если вам все же нужно, вы можете подумать о том, чтобы исправить то, что вы используете, чтобы вам не приходилось это делать. Тем временем вы, вероятно, не попадете в состояние гонки, и вы можете защититься от него, (скажем) проверив временную метку / proc / $ PID / непосредственно перед тем, как завершить процесс. Но это плохая хакерская игра.
Для всех, кто рекомендует шаг из kill $PID
к kill -9 $PID
, Я должен напомнить вам о Бесполезное использование kill -9.
Нет нет нет. Не используйте kill -9.
Это не дает процессу чисто:
отключение сокетных соединений
очистить временные файлы
сообщить своим детям, что он уходит
сбросить его характеристики терминала
и так далее и так далее и так далее.
Как правило, отправьте 15 и подождите секунду или две, и если это не сработает, отправьте 2, а если это не сработает, отправьте 1. Если это не так, УДАЛИТЕ Двоичный файл, потому что программа плохо себя ведет!
Не используйте kill -9. Не вынимайте комбайн только для того, чтобы привести в порядок цветочный горшок.
Я не согласен с «удалить двоичную часть», но прогресс кажется менее опасным, чем просто kill -9
.
Я также согласен с заботой об условиях гонки при создании новых процессов с тем же упомянутым PID Вот.
Обычно вы хотите попробовать kill $PID
первый,
затем дайте ему немного поспать, чтобы посмотреть, завершится ли он изящно.
Если нет, то выполните kill -9 $PID
насильно избавиться от него.
Сначала сделайте свое обычное убийство, спите x количество секунд, а затем убейте -9, если оно все еще рядом. Кроме того, это действительно похоже на странную ситуацию, в которую вы попали, возможно, вы захотите объяснить нам более серьезную проблему.
почему не просто
kill -9 $PID