Como soft kill aplicações GUI via terminal?

22

Existe uma maneira de fechar um aplicativo GUI da maneira amigável " por favor, saia agora ", sem acesso gráfico à janela do aplicativo?

Por exemplo, se a tela do Gnome / X cair em preto, eu gostaria de mudar para tty2 e fechar aplicativos como o Firefox de uma maneira que permita salvar suas configurações, etc. Na melhor das hipóteses, sem mais consultas do usuário.

jfk
fonte

Respostas:

19

Geralmente, você pode usar o SIGHUP para "amigável" fechar um aplicativo (com ou sem interface gráfica).

kill -HUP <application_pid>

EDITADO : adicionou algumas outras informações

A maneira como o SIGHUP é manipulado depende da aplicação; portanto, como Dave observou, pode acontecer que esse sinal seja mascarado ou manipulado. No entanto, todos os aplicativos interativos saem normalmente com um SIGHUP.

Por outro lado, tenho que admitir que geralmente sigo este esquema:

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

Obviamente, o último comando não é tão "amigável".

andcoz
fonte
3
Se você não souber o PID do aplicativo, poderá usar pkillpara especificar o nome do executável. Por exemplo:pkill -HUP firefox-bin
Caleb
@ Dave também: Interessante, eu achei isso relacionado, o que sugere uma ordem semelhante, mas revertida: TERM-> INT-> HUP (lembre-se da velhice). Talvez eu tenha em mente HUP-> INT-> TERM, pois KILL não parece ser amigável comigo. Obrigado a todos.
JFK
@ Caleb, apenas tenha cuidado lá, onde há vários processos com o mesmo nome: pkillmatará todos eles. Por exemplo, executar este algumas vezes para fazer alguns processos em segundo plano: sed "s/Woo/woo/" < /dev/urandom >> /dev/null &. Então faça pkill -HUP sed. Você matará todas as instâncias do sed que você iniciou, além de outras instâncias que executam um trabalho útil.
ahcox
O @Caleb, além disso, pkilltambém matará alguns aplicativos que você não espera: por exemplo, se você estiver chromiumexecutando e quiser matar um programa chamado rom, pkillserá felizmente chromiumderrubado. Melhor uso killall, que corresponderá apenas ao nome exato (embora não no Solaris, onde literalmente mata todos os processos ).
Ruslan
@Ruslan Ou use pkill -xpara obter uma correspondência exata em vez de parcial. Pessoalmente, aproveito a correspondência parcial para salvar a digitação, mas você precisa saber o que a ferramenta faz. Sim, por padrão, corresponde a cadeias parciais. Outra opção útil é -fcombinar com a linha de comando completa em vez de apenas $0.
Caleb
5

Você pode tentar:

kill -TERM <pid>

ou

kill -TERM `pidof <application_name>`

Pelo menos em alguns sistemas, quando o sistema está sendo desligado, todos os processos recebem o sinal TERM (15) antes de receber o sinal KILL (9). O HUP geralmente faz com que o aplicativo recarregue suas configurações, mas pode ser diferente processo por processo.

Dave
fonte
2

Não existe uma maneira geral de dizer a um aplicativo para sair e salvar sua configuração. Pode haver maneiras de notificar aplicativos usando uma estrutura específica, por exemplo, dcop kfoo MainApplication-Interface quitpara alguns aplicativos do KDE 3. Lembre-se de que o aplicativo pode mostrar uma caixa de diálogo solicitando sua confirmação.

Se a exibição do X se tornar inutilizável, mate o servidor X. Pressione Ctrl+ Alt+ BackSpace; se isso não funcionar, mate o processo do servidor X com sudo pkill -x Xorg. Quando o servidor X morre, todos os aplicativos X são notificados e tentam sair normalmente (não há garantia de que salvarão tudo, mas é sua melhor aposta).

Gilles 'SO- parar de ser mau'
fonte
Eu não sabia se os aplicativos serão notificados ou apenas mortos; e como a combinação de teclas não está habilitada por padrão no Fedora ... agora eu sei como matá-lo pela linha de comando!
JFK
1

Semelhante à resposta de @ andcoz, se você não conhece o PID do aplicativo (suponho que você não o conheça de cor), tente o seguinte:

kill -HUP `pidof [application_name]`
n0pe
fonte
2
Tome esse frather um passo e tentar pkill -HUP [application_name]:)
Caleb
Apenas aprendi pkill e pgrep: D
jfk
1

Dois outros comandos que você pode querer considerar são wmctrl -ce xdotool windowkill. Não sei se windowkillé exatamente o que você procura, senão você pode estar interessado no windowdeletepatch.

Jamie Kitson
fonte