Способ убить замороженное приложение

У меня есть приложение, которое зависает. Я не могу завершить его с помощью ^C, поэтому я должен сделать следующее:

$ ./myapp 
^C^Z
[1]+  Stopped                 ./myapp
$ pgrep -lf myapp
18479 bash ./myapp
$ kill -9 18479
$ fg
bash: fg: job has terminated
[1]+  Killed                  ./myapp
$

В редких случаях это нормально. Но если я являюсь автором этого приложения и пытаюсь детализировать проблему, которая вызывает зависание, очень раздражает делать это снова и снова. Есть ли способ сохранить несколько нажатий клавиш в таком сценарии?

Обновить:

pgrep + kill может быть заменено на pkill -f -9 myappспасибо Ли Б

В идеале я хочу сократить путь до одного нажатия клавиши, например ^C. Неважно, на каком уровне это реализовано: на терминале gnome, на bash, где угодно.

5 ответов

Решение

Если Ctrl-C не работает, вы должны иметь возможность использовать Ctrl-\, который будет отправлять сигнал KILL, а не сигнал TERM, который посылает ctrl-c.

killall -9 myapp? Я не совсем уверен, что это то, что вы ищете, но именно поэтому я часто останавливаю приложения.:)

Если вы использовали Control-Z для фонового процесса, вы можете использовать управление заданиями в качестве ярлыка. Я часто делаю:

^z
kill %1

kill -9и т. д., также будет работать с %1 аргументы стиля См. Раздел "Управление заданиями" на странице руководства bash для получения дополнительной информации об управлении заданиями. jobs Команда, в частности, также полезна.

pkill -9 myapp

Ваш дистрибутив может не предоставить pkill, но если нет, получите его.

Тем не менее, это не очень хороший способ завершения программного обеспечения. Вы ищите строку и убиваете все, что соответствует. Нет гарантии, что какое-то не связанное приложение не будет соответствовать. Скажите, что ваше приложение "тост", для определения времени, когда хлеб хорошо поджарен. Вы за это боретесь и убиваете это. Нет проблем. Но кто-то еще может запустить "video_toaster_daemon". Video Toaster - это название профессиональной системы видеоэффектов. Теперь ваш сценарий только что убил телевизионный графический проект какой-то компании. Они немного расстроены;)

Вместо этого посмотрите на:

  • Для приложений, убедитесь, что Ctrl-C убивает его. Должен быть какой-то способ перехватить сигнал и закрыть все потоки или все, что обычно мешает выходу.

  • Если ваше приложение действительно является службой, посмотрите, как большинство сценариев init.d запускают программы, и сохраните свои идентификаторы процессов, чтобы потом их убить. Остановка вашего сервиса должна быть такой же простой, как /etc/init.d/myserver stop.

Почему бы вам не отладить приложение и не попытаться предотвратить зависание?

Если вы хотите сделать это быстро, kill -9 $(pgrep myapp)

Другие вопросы по тегам