Comment lancer proprement une application graphique via le terminal?

78

Certaines applications de l'interface graphique se lancent proprement via la ligne de commande du terminal, mais d'autres non, et le terminal attend la fin de l'application. Même dans ce cas, certains ne "libèrent" pas la ligne de commande.

Le &suffixe esperluette mystérieuse 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 afin d'éviter tout effet de blocage, comme si vous lanciez 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 en cours d'impression dans le terminal.

Peter.O
la source
À la demande de Horque, j'ai supprimé sa réponse que vous avez acceptée. Veuillez choisir une autre réponse (vous devrez désélectionner en premier la sélection de htorque - elle devrait se cacher au bas de la page en rouge)
Oli
1
La méthode pour traiter un programme déjà en cours (comme indiqué par con-f-use) est bonne dans cette situation, mais comme ma question principale portait sur le lancement propre sans fouillis de terminal , j'ai accepté screen(mentionné par Oli et RobinJ). Je suis impressionné par sa capacité; après avoir lu et l' essayer ... Il ne nécessite que la saisie de: screen -d -m gedit(ou screen geditalors Ctrl+a dà se détacher) ... et j'ai encore accès complet à la vue terminal gedit (pour les messages d' avertissement , etc.) à tout moment via screen -rmême si je ont fermé la fenêtre du terminal d'origine entre-temps ...
Peter.O
En passant, certaines des tâches que vous attribuez au terminal sont en fait effectuées par le shell, par exemple en interprétant le &suffixe de la commande. Cela peut être utile pour des éclaircissements: Quelle est la différence entre Terminal, Console, Shell et Ligne de commande?
Wjandrea

Réponses:

17

Dans le cas de gedit, je garde juste une copie ouverte tout le temps. Tant que vous avez une copie en cours d'exécution, lancer des geditappels à 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 fan de nohup... Mais si vous avez besoin d'un terminal, vous pouvez vous en 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 irssice watch uptimeserait même un bon exemple.
  2. Tuez le terminal et démarrez-en un nouveau.
  3. Run screen -rand BOOM, vous êtes de retour.

screenest beaucoup plus grand que cela et vous pouvez le combiner byobupour une meilleure expérience de terminal. Lire autour.

Oli
la source
C’est la première fois que j’ai vraiment compris ce que l’écran fait / peut faire… merci pour l’astuce du terminal…
Peter.O
screen n'est plus disponible, mais tmux peut remplacer screen. (tmux pour démarrer une nouvelle session tux, ctrl + b, puis appuyez sur d pour deatach, et tmux attache à une nouvelle attache)
Gman Smith
84

Supposons que geditle programme que vous souhaitez exécuter soit détaché (ou "désapprouvé", "démêlé", "découplé"). Il y a différentes manières selon ce que vous voulez faire exactement:

Programme déjà en cours

Renier:

disown -hest la voie à suivre si vous voulez le faire avec un programme déjà en cours d’exécution (c’est-à-dire si vous avez oublié de le nohupfaire). Vous devez d'abord l'arrêter avec Ctrl+ Z. Ensuite, vous pouvez mettre en arrière-plan en utilisant bg [jobId](par exemple bg 1). Vous obtenez une liste des travaux en cours avec leur jobId 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

Programme pas encore commencé

nohup

nohupn'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 que vous voulez rediriger la sortie shell ainsi et votre programme une source d'entrée pseudo, 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 à empêcher les hickups dans SSH, par exemple.

Sous-coquille:

Vous pouvez obtenir un effet similaire en

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

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

Multiplexage terminal

Aussi multiplexage terminal 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 Passer à la fenêtre précédente
  • F6 Détacher de la session et se déconnecter
  • Shift-F6 Détacher de la session, mais ne pas se déconnecter
  • F7 Entrer en mode de défilement / recherche
  • Ctrl-F5 Reconnectez tous 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 vers le prochain partage
  • Shift-F4 Déplacer le focus vers la division précédente
  • Shift-F5 Réduire toutes les divisions
  • F5 Actualiser toutes les notifications d'état
  • F8 Renommer la fenêtre en cours
  • F9 Lancer le menu de configuration Byobu
  • F12 Touche d'échappement de l'écran GNU
  • Alt-Pageup Revenir dans l'historique de cette fenêtre
  • Alt-Pagedown Faire défiler en avant dans l'historique de cette fenêtre
  • Ctrl-a-! Activer ou désactiver tous les raccourcis clavier de Byobu

Le démon 'at' et d'autres

atest un petit outil 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

Aussi, vous pouvez examiner setsidet start-stop-daemon, mais les autres méthodes devraient suffire.

embrouiller
la source
Conseil: s'il n'y a qu'un seul travail, l'ID de travail est facultatif, par exemple, bg %1vous pouvez simplement taper à la place bg.
MasterMastic
25

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).

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 processus stdin, stdout et stderr sont toujours connectés au terminal; vous pouvez rediriger ceux-ci 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 tâches, le ramener au premier plan (commande fg) et lui envoyer des signaux (commande kill).

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


Voici un court script que vous pouvez 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 cherche le programme ($ prog) avant de rediriger les erreurs pour le localiser. 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.

À l'exception des redirections et du traitement des erreurs, cela équivaut à la réponse de htorque .

Communauté
la source
Ok, merci ... Il semble que ctrl-z(suspendre) me donne à nouveau accès à la ligne de commande, mais efface l'interface graphique jusqu'à ce que je sois sûr de bgne pas le suspendre. (logique) ... Existe-t-il une autre commande permettant de détacher l'interface graphique ... Aha! Je vois maintenant ce que vous entendez par sighals (kill command)... (choses intéressantes ces signaux) .. J'ai utilisé un extrait de code pour le faire ddafficher progressivement stats .. et il a utilisé kill+ un SIGNAL ... Y a-t-il un SIGNAL spécifique pour détacher un "travail "?
Peter.O
Je viens de remarquer votre commentaire sur la réponse de Rick ... J'ai essayé les disown travaux -p gedit`` et il a semblé supprimer le travail .... (mais j'ai reçu des messages système dans le terminal lorsque j'ai fermé manuellement gedit ... mais je pense J'ai un terminal
pourri
@fred: Les tâches sont gérées par le shell, donc aucun signal ne peut contrôler cela. Vous trouverez peut-être plus efficace de démarrer plusieurs shells: plusieurs terminaux à interface graphique permettent les onglets et vous pouvez utiliser screen ou tmux.
2
@fred: Mieux vaut ne pas s'exécuter jobs -p commandsi vous avez plusieurs instances d'une commande s'exécutant en arrière-plan à la fois. vous pouvez utiliser jobspour trouver le bon identifiant de travail puis le faire jobs -p <job-id>pour obtenir le PID du travail. Personnellement je trouve la version avec le sous-shell beaucoup plus facile. ;-)
htorque
2
@htorque, fred: Vous pouvez exécuter désaventur sans paramètres pour que bash désavoue le dernier travail:gedit & disown
22

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

firefox &!
Meule
la source
6
Bon à savoir, mais cela semble être uniquement en zsh. En bash, vous devez exécuter manuellement disown <pid-of-command>après avoir lancé la commande en arrière-plan.
Htorque
Intéressant ... Je vais me pencher sur zsh, mais en tant que débutant Linux, je vais rester avec bash pour le moment ... Merci
Peter.O
que fait le point d'exclamation?
Noisette à propos de natty
1
Le ! séparera le processus de demande du processus de terminal afin que vous puissiez fermer le terminal sans l’application lancée à partir de la fermeture. Cela semble être une chose de zsh, mais pratique.
Rick
Mais cela a également fonctionné à @ htorque bash .... Donc, je suppose que ce n'est pas un problème.
Jasser
20

Utilisation 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 à s'exécuter en arrière-plan après la fin du processus parent. Voir la page de manuel

Par exemple:

nohup gedit something
Florian Diesch
la source
2
C'est quoi nohup? S'il vous plaît élaborer.
Oxwivi
3
nohup est un programme qui exécute une commande donnée avec des signaux de raccrochage ignorés, afin que la commande puisse continuer à s'exécuter en arrière-plan après la fin du processus parent. Voir la page de manuel
Florian Diesch
En fait, je pense que ma réponse est incorrecte ici. Après réflexion, nohupdevrait être utilisé dans ce scénario.
boehj
2
Lorsqu'un shell interactif reçoit un signal SIGHUP, vous pouvez envoyer (ou non, en fonction des paramètres) un signal SIGHUP à tous ses enfants. Cela peut se produire (ou non, encore) lorsqu'un terminal est fermé. Un enfant qui n'est pas prêt à gérer un tel signal exécutera l'action par défaut, à savoir quitter. L' nohupapplication (et le disownbash builtin) ne permet pas au signal d'atteindre l'application.
enzotib
2
Une chose à faire est que nohupcrée un fichier dans le répertoire courant appelé nohup.out. Voir la page de manuel pour plus de détails. Je préfère disownpour cette raison, et pour le fait que cela disownfonctionne après votre lancement gedit.
Flimm
4

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

RobinJ
la source
Qu'est-ce que GNU Screen?
Oxwivi
Si je comprends bien l'idée, c'est une sorte de gestionnaire de fenêtres pour la ligne de commande. Il vous permet d'exécuter plusieurs programmes à la fois dans une session d'interface de ligne de commande.
RobinJ
Byobu?
Oxwivi
Quelque chose comme ça, seul Byobu est plus facile à utiliser. Si je me trompe, Byobu est simplement une interface plus simple pour GNU Screen.
RobinJ
1

Cela a fonctionné pour moi:

$ (nohup gedit 2>/dev/null &)
Wesleycoder
la source
1

xdg-open

Jetez un coup d'œil à cet utilitaire polyvalent: https://linux.die.net/man/1/xdg-open

Cela ouvrira un emplacement relatif dans votre gestionnaire de fichiers.

 $ xdg-open .

Cela ouvrira un fichier pdf dans un lecteur de pdf.

 $ xdg-open foo.pdf

Vous pouvez même fournir des URL Web

$ xdg-open www.google.com
Jonathan Komar
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.

Lokesh Devnani
la source
0

Cela fonctionne même à l'intérieur d'un script (comme les alias, la bande-annonce n'est pas autorisée dans les scripts car ils ne sont pas interactifs):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'
Sam
la source
0

Cela a fonctionné pour moi:

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

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
Eyal Levin
la source