Назад | Перейти на главную страницу

Фрагмент Bash для убийства процесса до его смерти?

Я пытаюсь написать надежный сценарий 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.

Это не дает процессу чисто:

  1. отключение сокетных соединений

  2. очистить временные файлы

  3. сообщить своим детям, что он уходит

  4. сбросить его характеристики терминала

и так далее и так далее и так далее.

Как правило, отправьте 15 и подождите секунду или две, и если это не сработает, отправьте 2, а если это не сработает, отправьте 1. Если это не так, УДАЛИТЕ Двоичный файл, потому что программа плохо себя ведет!

Не используйте kill -9. Не вынимайте комбайн только для того, чтобы привести в порядок цветочный горшок.

Я не согласен с «удалить двоичную часть», но прогресс кажется менее опасным, чем просто kill -9.

Я также согласен с заботой об условиях гонки при создании новых процессов с тем же упомянутым PID Вот.

Обычно вы хотите попробовать kill $PID первый,

затем дайте ему немного поспать, чтобы посмотреть, завершится ли он изящно.

Если нет, то выполните kill -9 $PID насильно избавиться от него.

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

почему не просто

kill -9 $PID