Question Comment lancer une application graphique via le terminal (pour ne pas attendre la fin)?


Certaines applications graphiques se lancent proprement via la ligne de commande du terminal.

Certains ne le font pas et ils obligent le terminal à attendre la fin de l'application.
... et même alors, certains ne "libèrent" pas la ligne de commande.

Le mystérieux "et" du suffixe "et" semble amener le terminal à mettre 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, de sorte qu’il n’y ait pas d’effet «accroché»? ... comme lancer quelque chose via F2.

Je voudrais que la ligne de commande soit à nouveau disponible immédiatement (sans qu'il y ait encore quelque chose en arrière-plan et en écrivant un message système dans le terminal).


68
2017-10-31 10:50


origine


À la demande de htorque, j'ai supprimé sa réponse que vous avez acceptée. S'il vous plaît, pourriez-vous choisir une autre réponse (vous devrez désélectionner la première de htorque - devrait se cacher au bas de la page en rouge) - Oli♦
La méthode pour traiter un Programme en cours d'exécution (comme indiqué par con-f-use) est bon pour cette situation, mais comme ma principale question était lancement propre sans fouillis terminalJ'ai accepté screen (mentionné par Oli et RobinJ). Je suis impressionné par sa capacité; après l'avoir lu et essayé ... Il suffit de taper: screen -d -m gedit (ou screen gedit puis Ctrl+a d pour détacher) ... et j'ai toujours un accès complet à la vue du terminal de gedit (pour les messages d'avertissement, etc.) à tout moment via screen -r même si j'ai fermé la fenêtre de terminal d'origine entre-temps ... - Peter.O


Réponses:


Dans le cas de gedit, je garde juste une copie ouverte tout le temps. Tant que vous avez une copie existante en cours d'exécution, lancez gedit les appels du terminal et la fermeture du terminal ne tue pas gedit.

Pour d'autres choses, ce que d'autres ont dit fonctionnerait aussi. Je suis fan de nohup... Mais si vous avez besoin d'un terminal, vous pouvez le détacher mais ensuite le rattacher, vous voulez regarder 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 ou même watch uptime serait de bons exemples.
  2. Tuez le terminal et commencez un nouveau.
  3. Courir screen -r et BOOM, vous êtes de retour

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


17
2018-05-31 12:25



C’est la première idée réelle que j’ai eue de ce que l’écran peut / peut faire… merci pour le bout du terminal… - Peter.O
l'écran n'est plus disponible, mais tmux peut remplacer l'écran. (tmux pour lancer une nouvelle session tmux, ctrl + b, puis appuyez sur d pour lancer la sélection, et tmux se connecte à nouveau) - Gman Smith


Supposer gedit est le programme que vous voulez exécuter séparément (alias "désavouer", "démêler", "découpler"). Il y a différentes manières selon ce que vous voulez faire exactement:

Programme en cours d'exécution

Renier:

disown -h est 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 nohup il). Vous devez d'abord l'arrêter en utilisant Ctrl+Z. Ensuite, vous pouvez mettre dans le support en utilisant bg [jobId] (par exemple. bg 1). Vous obtenez une liste des travaux en cours avec leur jobId en utilisant jobs. Après cela, vous pouvez le découpler du terminal en utilisant disown -h %[jobId]. Exemple de session de terminal:

confus@confusion:~$ gedit 
^Z
[1]+  Stopped                 gedit
confus@confusion:~$ jobs
[1]+  Stopped                 gedit
confus@confusion:~$ bg 1
[1]+ gedit &
confus@confusion:~$ disown -h %1
confus@confusion:~$ exit

Programme 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 utiliseriez:

nohup gedit &

Peut-être voudrez-vous également rediriger la sortie du shell et votre pseudo source d'entrée, donc: nohup ./myprogram > foo.out 2> bar.err < /dev/null &. Vous souhaitez rediriger la sortie soit pour ne pas être agacée par elle ou pour l'utiliser plus tard. Le paramètre null-input peut aider à empêcher les attaques de ssh dans un tel.

Subshell:

Vous pouvez obtenir un effet similaire en

confus@confusion:~$ (geany 2>&1 /dev/null &)

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

Terminal multiplex

Aussi le multiplexage du terminal en utilisant écran 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 des 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              Se détacher de la session et se déconnecter
  • Maj-F6        Détachez-vous de la session, mais ne vous déconnectez pas
  • F7              Entrez le mode de défilement / recherche
  • Ctrl-F5         Reconnectez les sockets ou agents SSH / GPG

Moins utile:

Maj-F2        Diviser l'écran horizontalement - Ctrl-F2         Séparer l'écran verticalement - Maj-F3        Déplacer le focus sur la prochaine division - Maj-F4        Déplacer le focus sur la division précédente - Maj-F5        Collapse all splits - F5              Actualiser toutes les notifications d'état - F8              Renommer la fenêtre actuelle - F9              Lancez le menu de configuration de Byobu - F12             Clé d'échappement de l'écran GNU - Alt-Pageup      Faites défiler l'historique de cette fenêtre - Alt-Pagedown    Faites défiler l'histoire de cette fenêtre - Ctrl-a-!        Activer ou désactiver tous les raccourcis clavier de Byobu -

Le 'at' deamon et les autres

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

echo './myprogram myoption1 myoption2' | at now

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


79
2018-05-31 12:28



Conseil: s'il n'y a qu'un travail, l'ID du travail est facultatif, par ex. au lieu de bg %1 vous pouvez juste taper bg. - MasterMastic


Le mystérieux "et" du suffixe "et" semble amener le terminal à mettre le processus en arrière-plan ... (mais je ne suis pas sûr de ce qui se 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 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écutez la commande "normalement", vous remarquerez qu'il démarre le programme graphique et "quitte".


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 rediriger afin que des 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 quelque part.

Sauf pour les redirections et la gestion des erreurs, cela équivaut à réponse de htorque.


25
2017-10-31 11:25



Okay, merci ... Il semble que ctrl-z (suspendre) me donne à nouveau accès à la ligne de commande, mais supprime l'interface graphique jusqu'à ce que j'émette bg qui semble le suspendre. (a du sens) ... Y a-t-il une autre commande par laquelle je peux détacher le GUI ... Aha! Je vois maintenant ce que tu veux dire par sighals (kill command)... (choses intéressantes ces signaux) .. J'ai utilisé un extrait de code pour faire dd sortir progressivement ses stats .. et il a utilisé kill + un SIGNAL ... Y a-t-il un SIGNAL spécifique pour détacher un "job"? - Peter.O
Je viens de remarquer votre commentaire à la réponse de Rick ... J'ai essayé disown jobs -p gedit`` et il semble que le job soit supprimé .... (mais j'ai eu des messages système dans le terminal quand j'ai fermé manuellement gedit ... mais je pense que j'ai un terminal foutu en ce moment. .. trop expérimenter :( - Peter.O
@fred: les jobs sont gérés par le shell, donc aucun signal ne peut contrôler cela. Vous pouvez trouver que cela fonctionne mieux pour démarrer plusieurs shells - plusieurs terminaux GUI permettent des onglets et vous pouvez utiliser screen ou tmux.
@fred: mieux vaut ne pas courir jobs -p command Si vous avez plusieurs instances d'une commande s'exécutant en arrière-plan à la fois. vous pouvez utiliser jobs pour trouver le bon job id et ensuite faire jobs -p <job-id> pour obtenir le PID du travail. Personnellement, je trouve la version avec le sous-shell beaucoup plus facile. ;-) - htorque
@htorque, fred: Vous pouvez lancer la désinscription sans paramètres pour que bash rejette le dernier travail: gedit & disown


Utilisation nohup

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

Par exemple:

nohup gedit something

20
2018-05-31 12:10



Quel est nohup? Veuillez élaborer. - Oxwivi
nohup est un programme qui exécute une commande donnée avec des signaux de rachat ignorés, de sorte que la commande puisse continuer à s'exécuter en arrière-plan une fois son processus parent terminé. Voir le page de manuel - Florian Diesch
En fait, je pense que ma réponse est incorrecte ici. Sur plus de pensée, nohup devrait être utilisé dans ce scénario. - boehj
Lorsqu'un shell interactif reçoit un signal SIGHUP, il peut envoyer (ou non, selon les paramètres) un signal SIGHUP à tous ses enfants. Cela peut arriver (ou pas encore) lorsqu'un terminal est fermé. Un enfant non prêt à gérer un tel signal exécutera l'action par défaut, c'est-à-dire quitter. le nohup application (et le disown bash builtin) ne permettent pas au signal d'atteindre l'application. - enzotib
Une chose à faire attention est que nohup crée un fichier dans le répertoire en cours appelé nohup.out. Voir le page de man pour plus de détails. je préfère disown pour cette raison, et pour le fait que disown fonctionne après le lancement gedit. - Flimm


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

firefox &!

18
2017-10-31 12:20



Bon à savoir, mais cela semble être uniquement zsh. En bash, vous devrez 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 sur Linux, je vais rester avec bash pour le moment ... Merci - Peter.O
Que fait le point d'exclamation? - nutty about natty
Le ! va briser le processus d'application à partir du processus de terminal afin que vous puissiez fermer le terminal sans l'application lancée depuis la fermeture. Cela semble être une chose géniale, mais pratique. - Rick
Mais ça a aussi fonctionné en @htorque .... Donc je suppose que ce n'est pas un problème. - Jasser


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


4
2018-05-31 15:00



Qu'est-ce que l'écran GNU? - 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 juste une interface plus facile pour GNU Screen. - RobinJ


Cela a fonctionné pour moi:

$ (nohup gedit 2>/dev/null &)

1
2017-12-30 23:20





Comme beaucoup de gens l'ont compris, rien n'est à considérer. Mais les images fixes restent ouvertes sur le terminal et affichent l'activité du programme sur le terminal, ce qui est irritant. Vous pouvez simplement fermer le terminal 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 au démarrage de gedit. Comme gedit n'est pas associé au terminal maintenant, il reste actif.


0
2017-09-03 17:25





Cela fonctionne même à l'intérieur d'un script (à l'instar des alias, le trailer '&' n'est normalement pas autorisé dans les scripts car ils ne sont pas interactifs):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'

0
2018-01-02 19:40





Cela a fonctionné pour moi:

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

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null

0
2018-06-13 08:43