Как программно убить приложения с графическим интерфейсом через терминал?

22

Есть ли способ закрыть приложение с графическим интерфейсом дружественным способом « пожалуйста, выйдите сейчас », без графического доступа к окну приложений?

Например, если дисплей Gnome / X падает на черный, я бы хотел переключиться на tty2 и закрыть приложения, такие как firefox, таким образом, чтобы они могли сохранить свои настройки и т. Д. В лучшем случае без дальнейших запросов пользователей.

дж.ф.к.
источник

Ответы:

19

Обычно вы можете использовать SIGHUP для «дружественного» закрытия приложения (с графическим интерфейсом или без него).

kill -HUP <application_pid>

ИЗДАНО : добавлена ​​другая информация

Способ обработки SIGHUP зависит от приложения, поэтому, как заметил Дейв , может случиться, что этот сигнал замаскирован или обработан. Однако почти все интерактивные приложения выходят изящно с SIGHUP.

С другой стороны, я должен признать, что обычно я следую этой схеме:

kill -HUP <application_pid>
# check if application is still running
kill -INT <application_pid>
# check if application is still running
kill -KILL <application_pid>

Очевидно, что последняя команда не так «дружелюбна».

andcoz
источник
3
Если вы не знаете PID приложения, вы можете pkillуказать вместо него имя исполняемого файла. Например:pkill -HUP firefox-bin
Калеб
@ Дейв тоже: Интересно, я обнаружил, что это связано, что предполагает похожий, но обратный порядок: TERM-> INT-> HUP (помните старость). Может быть, я буду помнить HUP-> INT-> TERM, так как KILL не кажется мне дружелюбным. Спасибо всем.
JFK
@Caleb, просто будь осторожен там, где есть несколько процессов с одинаковыми именами: pkillубьет их всех. Например, запустить это несколько раз , чтобы сделать некоторые фоновые процессы: sed "s/Woo/woo/" < /dev/urandom >> /dev/null &. Тогда делай pkill -HUP sed. Вы убьете все экземпляры sed, которые вы начали, а также все остальные экземпляры, выполняющие полезную работу.
АХКОКС
Кроме того, @Caleb pkillтакже убьет некоторые приложения, которые вы не ожидаете: например, если у вас есть chromiumзапущенная программа, и вы хотите убить вызванную программу rom, она pkillбудет счастливо chromiumсбита. Лучшее использование killall, которое будет соответствовать только точному названию (но не в Solaris, где оно буквально убивает все процессы ).
Руслан
@Ruslan Или используйте, pkill -xчтобы получить точное совпадение вместо частичного совпадения. Лично я использую частичное соответствие, чтобы сохранить набор текста, но вы должны знать, что делает инструмент. Да, по умолчанию это соответствует частичным строкам. Еще одна полезная опция - -fсопоставление с полной командной строкой, а не просто $0.
Калеб
5

Вы можете попробовать:

kill -TERM <pid>

или

kill -TERM `pidof <application_name>`

По крайней мере, в некоторых системах, когда система завершает работу, все процессы получают сигнал TERM (15), прежде чем они отправляют сигнал KILL (9). HUP часто просто заставляет приложение перезагружать свои конфигурации, но оно может отличаться в зависимости от процесса.

Дейв
источник
2

Нет общего способа сообщить приложению о выходе и сохранении его конфигурации. Могут быть способы уведомления приложений с использованием определенной среды, например, dcop kfoo MainApplication-Interface quitдля некоторых приложений KDE 3. Помните, что в приложении может отображаться диалоговое окно с запросом подтверждения.

Если X-дисплей становится непригодным для использования, убейте X-сервер. Нажмите Ctrl+ Alt+ BackSpace; если это не сработает, убейте процесс X-сервера с помощью sudo pkill -x Xorg. Когда X-сервер умирает, все X-приложения уведомляются, и они пытаются корректно завершить работу (нет гарантии, что они все сохранят, но это ваш лучший выбор).

Жиль "ТАК - перестань быть злым"
источник
Я не знал, будут ли приложения уведомлены или просто убиты; и поскольку комбинация клавиш не включена по умолчанию в Fedora ..... Теперь я знаю, как ее убить с помощью командной строки!
JFK
1

Сродни ответу @ andcoz, если вы не знаете PID приложения (я предполагаю, что вы не знаете его наизусть), попробуйте следующее:

kill -HUP `pidof [application_name]`
n0pe
источник
2
Сделай еще один шаг и попробуй pkill -HUP [application_name]:)
Калеб
Только что выучил pkill и pgrep: D
jfk
1

Две другие команды, которые вы можете рассмотреть, это wmctrl -cи xdotool windowkill. Я не уверен, windowkillчто именно то, что вы ищете, если нет, вас может заинтересовать windowdeleteпатч.

Джейми Китсон
источник