87 votes

Comment lancer proprement une application GUI via le Terminal ?

Certaines applications GUI se lancent proprement via la ligne de commande du terminal, mais d'autres ne le font pas et font attendre le terminal pour que l'application se termine. Et même dans ce cas, certaines ne "libèrent" pas la ligne de commande.

La mystérieuse esperluette & semble faire en sorte que le terminal mette le processus en arrière-plan (mais je ne suis pas sûr de ce qui se passe).

Existe-t-il un moyen de lancer une application via le terminal sans qu'il n'y ait d'effet d'attente, comme si l'on lançait quelque chose via le terminal ? Alt + F2 ?

J'aimerais que la ligne de commande soit à nouveau disponible immédiatement, sans que quelque chose soit encore en arrière-plan et s'imprime dans le terminal.

89voto

con-f-use Points 17925

Supposons que gedit est le programme que vous voulez exécuter de manière détachée (alias "désowned", "disentangled", "decoupled"). Il existe différentes façons de procéder, selon ce que vous voulez faire exactement :

Programme déjà en cours d'exécution

Disown :

disown -h est la solution si vous voulez faire cela avec un programme déjà en cours d'exécution (c'est-à-dire si vous avez oublié de nohup il). Vous devez d'abord l'arrêter en utilisant Ctrl + Z . Ensuite, vous pouvez mettre en arrière-plan en utilisant bg [jobId] (par exemple bg 1 ). Vous pouvez obtenir une liste des travaux en cours avec leur JobId en utilisant la méthode suivante jobs . Après cela, vous pouvez le découpler du terminal en utilisant disown -h %[jobId] . Exemple de session de terminal :

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit

Le programme n'a pas encore commencé

nohup

nohup n'est pas toujours présent sur toutes les machines. Si vous savez à l'avance que vous voulez découpler, vous pouvez utiliser :

nohup gedit &

Peut-être voudrez-vous rediriger la sortie de Shell ainsi que votre programme une pseudo source d'entrée, donc : nohup ./myprogram > foo.out 2> bar.err < /dev/null & . Vous voudriez rediriger la sortie pour ne pas être gêné par elle ou pour l'utiliser plus tard. L'entrée nulle peut aider à prévenir les problèmes dans ssh et autres.

Sous-coque :

Vous pouvez obtenir un effet similaire en

$ (geany >/dev/null 2>&1 &)

Les parenthèses ouvrent un nouveau sous-shell pour exécuter gedit. Le site >/dev/null 2>&1 redirige la sortie Shell vers nulle part (suppression de la sortie). Et le & à la fin met le processus en arrière-plan.

Multiplexage des terminaux

De même, le multiplexage des terminaux utilisant écran o byobu . En fait, vous exécutez le programme dans un terminal qui lui est propre. Je peux vraiment recommander byobu pour d'autres raisons aussi. Vous trouverez ci-dessous une liste de raccourcis de byobu qui pourraient vous être utiles pour vos premiers pas :

Utile :

  • F2 Créer une nouvelle fenêtre
  • F3 Passer à la fenêtre suivante
  • F4 Passer à la fenêtre précédente
  • F6 Se détacher de la session et se déconnecter
  • Shift-F6 Se détacher de la session, mais ne pas se déconnecter
  • F7 Entrer dans le mode de défilement/recherche
  • Ctrl-F5 Reconnectez les sockets ou agents SSH/GPG.

Moins utile :

  • Shift-F2 Diviser l'écran horizontalement
  • Ctrl-F2 Diviser l'écran verticalement
  • Shift-F3 Déplacer le focus sur le prochain split
  • Shift-F4 Déplacer le focus sur le split précédent
  • Shift-F5 Réduire tous les splits
  • F5 Rafraîchir toutes les notifications d'état
  • F8 Renommer la fenêtre actuelle
  • F9 Lancez le menu de configuration de Byobu
  • F12 Touche d'échappement de GNU Screen
  • Alt-Pageup Faites défiler l'historique de cette fenêtre
  • Alt-Pagedown Faites défiler l'historique de cette fenêtre
  • Ctrl-a-! Activez ou désactivez toutes les combinaisons de touches de Byobu.

Le démon 'at' et autres

at est un petit outil très utile pour exécuter une commande à une heure programmée. Il peut être "mal utilisé" pour détacher une commande du Shell :

echo './myprogram myoption1 myoption2' | at now

Vous pouvez également vous pencher sur setsid y start-stop-daemon mais les autres méthodes devraient suffire.

29voto

Alvaro Rodriguez Points 1382

Pour démarrer une application et la détacher du terminal lancé, utilisez & !

firefox &!

25voto

Le suffixe mystérieux de l'esperluette "&" semble faire en sorte que le terminal mette le processus en arrière-plan... (mais je ne suis pas sûr de ce qui se passe ici).

C'est le cas, et c'est souvent ce que vous voulez. Si vous oubliez d'utiliser &, vous pouvez suspendre le programme avec ctrl-z puis le placer en arrière-plan avec la commande bg - et continuer à utiliser ce Shell.

Les stdin, stdout et stderr du processus sont toujours connectés au terminal ; vous pouvez les rediriger de/vers /dev/null ou tout autre fichier (par exemple, enregistrer un journal de sortie quelque part), comme vous le souhaitez :

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

Vous pouvez voir le processus dans les travaux, le ramener au premier plan (commande fg), et lui envoyer des signaux (commande kill).

Certains programmes graphiques se détachent du terminal ; si c'est le cas, lorsque vous exécutez la commande "normalement", vous remarquerez qu'elle lance le programme graphique. y "sorties".


Voici un court script vous pouvez le placer dans ~/bin que j'ai nommé runbg :

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "$@" &  # $@ is all args

Je recherche le programme ($prog) avant de le rediriger afin que les erreurs de localisation puissent être signalées. Exécutez-le comme "runbg your-command args..." ; vous pouvez toujours rediriger stdout/err vers un fichier si vous avez besoin de sauvegarder la sortie quelque part.

À l'exception des redirections et de la gestion des erreurs, ceci est équivalent à Réponse de htorque .

20voto

Fabiano Soriani Points 543

Utilice nohup

nohup est un programme qui exécute une commande donnée avec des signaux de raccrochage. ignorés, afin que la commande puisse continuer à fonctionner en arrière-plan. après la fin de son processus parent. Voir le page d'accueil

Par exemple :

nohup gedit something

17voto

Mufaka Points 54

Dans le cas de gedit, je garde juste une copie ouverte en permanence. Tant que vous avez une copie existante en cours d'exécution, le lancement de gedit à partir du terminal, puis fermer le terminal ne tuera pas gedit.

Pour d'autres choses, ce que d'autres personnes ont dit fonctionnerait aussi. Je suis un fan de nohup ... Mais si vous avez besoin d'un terminal auquel vous pouvez vous détacher puis vous réattacher, vous devez vous tourner vers screen .

  1. Exécutez-le dans un terminal, puis exécutez quelque chose qui continue à pousser la sortie. J'utilise le serveur de développement Django mais irssi いやしくも watch uptime seraient de bons exemples.
  2. Tuer le terminal et en démarrer un nouveau.
  3. Exécuter screen -r et BOOM, tu es de retour.

screen est bien plus grande que cela et vous pouvez la combiner avec byobu pour une meilleure expérience du terminal. Lisez autour de vous.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X