Я пытаюсь написать надежный скрипт bash, и в нем я создаю фоновый процесс. В конце сценария я хочу его убить. У меня есть PID.
Я думал о чем-то вроде этого
while [[ ps ef $PID ]] ; do
kill $PID
sleep 0.5
done
Любой предлагает что-нибудь лучше? Любые возможные проблемы с этим подходом?
ps -ef
?while [[ ps ef $PID ]]
это синтаксическая ошибка Я полагаю, вы имели в видуwhile ps ef $PID
.Ответы:
Проблема с многократным уничтожением процесса заключается в том, что у вас есть условие гонки с созданием нового процесса. Это не особенно вероятно, но возможно, что процесс завершится, и новый процесс запустится с тем же PID, пока вы спите.
Почему вы должны неоднократно убивать процесс? Если это происходит из-за того, что процесс завершится, но может пройти некоторое время после получения сигнала, вы можете использовать
wait
:В идеальной системе вам никогда не придется повторять
kill
или выпускатьkill -9 $PID
. Если вам нужно, вы можете рассмотреть возможность исправления того, что вы используете, чтобы вам не пришлось это делать. Тем временем вы, вероятно, не попадете в состояние гонки, и вы можете защититься от него, скажем, путем проверки метки времени / proc / $ PID / непосредственно перед тем, как завершить процесс. Это плохое хакерство.источник
bash: wait: pid 32137 is not a child of this shell
когда я пытаюсь. :(Всем, кто рекомендует переход с
kill $PID
наkill -9 $PID
, я должен напомнить вам о бесполезном использовании kill -9 .Я не согласен с «удалить двоичную часть», но прогресс выглядит менее разрушительным, чем просто
kill -9
.Я также согласен с заботой об условиях гонки при создании новых процессов с тем же PID, упомянутым здесь .
источник
Сначала сделайте свое обычное убийство, выспитесь x количество секунд, а затем убейте -9, если оно еще осталось. Кроме того, это кажется странной ситуацией, в которую вы попали, возможно, вы захотите объяснить нам более крупную проблему.
источник
Как правило, вы хотите попробовать в
kill $PID
первую очередь,затем дайте ему немного поспать, чтобы увидеть, выйдет ли он изящно.
Если нет, то выполните
kill -9 $PID
принудительно, чтобы избавиться от него.источник
почему не просто
kill -9 $PID
источник