Способ убить замороженное приложение
У меня есть приложение, которое зависает. Я не могу завершить его с помощью ^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)