Comment tuer des applications GUI via un terminal?

22

Existe-t-il un moyen de fermer une application GUI de manière conviviale " veuillez vous arrêter maintenant ", sans accès graphique à la fenêtre des applications?

Par exemple, si l'affichage de Gnome / X tombe en panne en noir, je voudrais basculer vers tty2 et fermer les applications comme firefox d'une manière qui leur permette d'enregistrer leur configuration, etc. Au mieux sans autres requêtes de l'utilisateur.

jfk
la source

Réponses:

19

Habituellement, vous pouvez utiliser SIGHUP pour fermer une application "amicalement" (avec ou sans interface graphique).

kill -HUP <application_pid>

EDITÉ : ajouté quelques autres informations

La façon dont SIGHUP est géré dépend de l'application, comme Dave l'a noté, il peut arriver que ce signal soit masqué ou traité. Cependant, toutes les applications interactives se terminent normalement avec un SIGHUP.

D'un autre côté, je dois admettre que d'habitude je suis ce schéma:

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

De toute évidence, la dernière commande n'est pas aussi "conviviale".

andcoz
la source
3
Si vous ne connaissez pas le PID de l'application, vous pouvez utiliser pkillà la place le nom de l'exécutable. Par exemple:pkill -HUP firefox-bin
Caleb
@Dave aussi: intéressant, j'ai trouvé ce lien qui suggère un ordre similaire mais inversé: TERM-> INT-> HUP (attention à la vieillesse). Peut-être que je garderai HUP-> INT-> TERM à l'esprit, car KILL ne semble pas être amical avec moi. Merci à tous.
jfk
@Caleb, faites juste attention là où il y a plusieurs processus avec le même nom: pkilltous les tueront. Par exemple, exécutez à quelques reprises pour faire des processus d'arrière - plan: sed "s/Woo/woo/" < /dev/urandom >> /dev/null &. Alors fais pkill -HUP sed. Vous tuerez toutes les instances de sed que vous avez démarrées ainsi que toutes les autres instances faisant un travail utile.
ahcox
De plus, @Caleb pkilltuera également certaines applications auxquelles vous ne vous attendez pas: par exemple, si vous avez en chromiumcours d' exécution et que vous voulez tuer un programme appelé rom, vous pkillserez volontiers chromiumabattu. Meilleure utilisation killall, qui ne correspondra qu'au nom exact (pas sur Solaris cependant, où il tue littéralement tous les processus ).
Ruslan
@Ruslan Ou utilisez pkill -xpour obtenir une correspondance exacte au lieu d'une correspondance partielle. Je profite personnellement de la correspondance partielle pour enregistrer la saisie, mais vous devez savoir ce que fait l'outil. Oui, par défaut, il correspond à des chaînes partielles. Une autre option utile consiste -fà faire correspondre la ligne de commande complète au lieu de simplement $0.
Caleb
5

Vous voudrez peut-être essayer:

kill -TERM <pid>

ou

kill -TERM `pidof <application_name>`

Au moins sur certains systèmes, lorsque le système est en cours d'arrêt, tous les processus reçoivent le signal TERM (15) avant d'être envoyés le signal KILL (9). HUP fait souvent simplement que l'application recharge ses configurations, mais cela peut être différent processus par processus.

Dave
la source
2

Il n'existe aucun moyen général de dire à une application de quitter et d'enregistrer sa configuration. Il peut y avoir des moyens de notifier les applications en utilisant un cadre particulier, par exemple dcop kfoo MainApplication-Interface quitpour certaines applications KDE 3. N'oubliez pas que l'application peut afficher une boîte de dialogue vous demandant de confirmer.

Si l'affichage X devient inutilisable, arrêtez le serveur X. Appuyez sur Ctrl+ Alt+ BackSpace; si cela ne fonctionne pas, arrêtez le processus du serveur X avec sudo pkill -x Xorg. Lorsque le serveur X meurt, toutes les applications X sont notifiées et elles essaieront de se fermer correctement (il n'y a aucune garantie qu'elles enregistreront tout, mais c'est votre meilleur pari).

Gilles 'SO- arrête d'être méchant'
la source
Je ne savais pas si les applications seront notifiées ou juste tuées; et comme le combo de touches n'est pas activé par défaut sur Fedora ..... Je sais maintenant comment le tuer en ligne de commande!
jfk
1

Similaire à la réponse de @ andcoz, si vous ne connaissez pas le PID de l'application (je suppose que vous ne le connaissez pas par cœur), essayez ceci:

kill -HUP `pidof [application_name]`
n0pe
la source
2
Faites ce petit pas et essayez pkill -HUP [application_name]:)
Caleb
Je viens d'apprendre pkill et pgrep: D
jfk
1

Vous pouvez également envisager deux autres commandes: wmctrl -cet xdotool windowkill. Je ne sais pas si windowkillc'est exactement ce que vous recherchez, sinon vous pourriez être intéressé par le windowdeletepatch.

Jamie Kitson
la source