Comment lancer proprement une application graphique via le terminal?

71

Certaines applications de l'interface graphique se lancent proprement via la ligne de commande du terminal, mais d'autres ne le font pas. Le terminal attend alors que l'application se termine. Même dans ce cas, certains ne "relâchent" pas la ligne de commande.

L'esperluette mystérieuse & suffixe semble amener le terminal à mettre le processus en arrière-plan (mais je ne suis pas sûr de ce qui s'y passe).

Existe-t-il un moyen de lancer une application via le terminal pour éviter tout effet de blocage, comme pour lancer quelque chose via 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 imprimée dans le terminal.

    
posée Peter.O 31.10.2010 - 11:50
la source

10 réponses

17

Dans le cas de gedit, je garde juste une copie ouverte tout le temps. Tant qu'une copie existante est en cours d'exécution, lancer gedit des appels depuis le 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, vous pouvez le détacher mais vous le reconnectez ensuite, vous voulez regarder screen .

  1. Exécutez-le dans un terminal, puis exécutez quelque chose qui continue de pousser la sortie. J'utilise le serveur de développement Django mais irssi ou même watch uptime seraient de bons exemples.
  2. Tuez le terminal et démarrez-en un nouveau.
  3. Exécutez screen -r et BOOM, vous êtes de retour.

screen est beaucoup plus gros que cela et vous pouvez le combiner avec byobu pour une meilleure expérience de terminal. Lire autour.

    
réponse donnée Oli 31.05.2011 - 14:25
la source
80

Supposons que gedit est le programme que vous souhaitez exécuter en mode détaché (ou "désapprouvé", "démêlé", "découplé"). Selon ce que vous voulez faire exactement, il y a différentes façons:

Programme en cours d'exécution

Désavoué:

disown -h est la voie à suivre si vous souhaitez le faire 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 avec Ctrl + Z . Ensuite, vous pouvez mettre entre parenthèses en utilisant bg [jobId] (par exemple, bg 1 ). Vous obtenez une liste des travaux en cours avec leur ID de travail en utilisant 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 que vous souhaitez découpler au préalable, vous utiliserez:

nohup gedit &

Peut-être voudrez-vous également rediriger la sortie du shell et donner à 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 ennuyé par elle ou pour l'utiliser plus tard. L'entrée nulle peut aider à prévenir les hickups dans SSH, par exemple.

Sous-shell:

Vous pouvez obtenir un effet similaire en

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

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

Multiplexage des terminaux

Multiplexez également les terminaux en utilisant screen ou byobu . Vous exécutez essentiellement 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 boybu qui pourraient vous être utiles pour vos premiers pas:

Utile:

  • F2 Créer une nouvelle fenêtre
  • F3 Passer à la fenêtre suivante
  • F4 Aller à la fenêtre précédente
  • F6 Détacher de la session et vous déconnecter
  • Shift-F6 Détachez de la session, mais ne vous déconnectez pas
  • F7 Entrer en mode de défilement / recherche
  • Ctrl-F5 Reconnectez tous les sockets ou agents SSH / GPG

Moins utile:

  • Maj-F2 Fractionner l'écran horizontalement
  • Ctrl-F2 Fractionner l'écran verticalement
  • Maj-F3 Déplace le focus sur le prochain partage
  • Shift-F4 Déplace le focus sur le groupe précédent
  • Maj-F5 Réduire tous les fractionnements
  • F5 Actualiser toutes les notifications d'état
  • F8 Renommer la fenêtre en cours
  • F9 Lancez le menu de configuration de Byobu
  • F12 Touche d'échappement de l'écran GNU
  • Alt-Pageup Revenez dans l'historique de cette fenêtre
  • Alt-Pagedown faire défiler l'historique de cette fenêtre
  • Ctrl-a -! Active ou désactive toutes les liaisons de clé de Byobu

Le démon "at" et d'autres

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

echo './myprogram myoption1 myoption2' | at now

Vous pouvez aussi regarder dans setsid et start-stop-daemon , mais les autres méthodes devraient suffire.

    
réponse donnée con-f-use 31.05.2011 - 14:28
la source
25

The mysterious ampersand "&" suffix, seems to cause the terminal to put the process into the background... (but I'm not sure what happens there).

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 placez-le à l'arrière-plan avec la commande bg - et continuez à utiliser ce shell.

Les processus stdin, stdout et stderr 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), à votre guise:

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

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

Certains programmes graphiques vont se détacher du terminal. Si c'est le cas, lorsque vous exécuterez la commande "normalement", vous remarquerez qu'il lance le programme graphique et "exits".

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" "[email protected]" &  # [email protected] is all args

Je cherche le programme ($ prog) avant de le rediriger pour pouvoir signaler les erreurs de localisation. Exécutez-le en tant que "runbg your-command args ..."; vous pouvez toujours rediriger stdout / err vers un fichier si vous devez enregistrer la sortie quelque part.

Hormis les redirections et le traitement des erreurs, cela équivaut à La réponse de Horque .

    
réponse donnée Roger Pate 31.10.2010 - 12:25
la source
20

Utilisez nohup

nohup is a program that runs a given command with hangup signals ignored, so that the command can continue running in the background after its parent process terminates. See the manpage

Par exemple:

nohup gedit something
    
réponse donnée Florian Diesch 31.05.2011 - 14:10
la source
18

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

firefox &!
    
réponse donnée Rick 31.10.2010 - 13:20
la source
4

Ouvrez le terminal, tapez screen , tapez la commande que vous souhaitez exécuter, fermez le terminal. Le programme devrait continuer à fonctionner dans la session GNU Screen .

    
réponse donnée RobinJ 31.05.2011 - 17:00
la source
1

Cela a fonctionné pour moi:

$ (nohup gedit 2>/dev/null &)
    
réponse donnée wesleycoder 31.12.2012 - 00:20
la source
0

Comme beaucoup de gens l'ont compris, nohup est la chose à considérer. Mais nohup stills reste ouvert sur le terminal et affiche l'activité du programme sur le terminal qui est irritante. Vous pouvez simplement fermer le terminal après cela pour éviter cela. J'ai découvert une solution de contournement très simple que j'utilise.

nohup gedit & exit

Et c'est tout. Il ouvre gedit et ferme le terminal lorsque gedit démarre. Comme gedit n’est pas associé au terminal, il reste actif.

    
réponse donnée Lokesh Devnani 03.09.2015 - 19:25
la source
0

Cela fonctionne même dans un script (comme les alias, la fin de message '&' n'est pas autorisée dans les scripts car ils ne sont pas interactifs):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'
    
réponse donnée Sam 02.01.2018 - 20:40
la source
0

Cela a fonctionné pour moi:

$ (some-program &) &>/dev/null

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
    
réponse donnée Eyal Levin 13.06.2018 - 10:43
la source

Lire d'autres questions sur les étiquettes