У меня приложение зависает. Я не могу прервать его с помощью ^ 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
, спасибо Lee B
В идеале я хочу сократить путь до одного нажатия клавиши, например ^ C. Неважно, на каком уровне это реализовано: на терминале gnome, на bash, где угодно.
Если вы использовали 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.
killall -9 myapp
? Я не совсем уверен, что вы ищете, но именно так я часто принудительно останавливаю приложения. :)
Если Ctrl-C не работает, вы можете использовать Ctrl- \, который будет отправлять сигнал KILL, а не сигнал TERM, который отправляет ctrl-c.
Почему бы вам не отладить приложение и не попытаться предотвратить зависание?
Если вы хотите сделать это быстро, kill -9 $(pgrep myapp)