web-dev-qa-db-fra.com

Comment lancer proprement une application graphique via le terminal?

Certaines applications de l'interface graphique se lancent proprement via la ligne de commande du terminal, mais d'autres ne le font pas, 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 mystérieux esperluette & 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 si vous lançiez 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.

78
Peter.O

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, le lancement d'appels gedit à partir du terminal, puis la fermeture du terminal ne tueront 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 en 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.

17
Oli

Supposons que gedit soit le programme que vous souhaitez exécuter en mode 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 -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 le). 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 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 à l'aide de 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

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, par exemple: 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. 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 terminal

De plus, le multiplexage terminal utilise screen ou byob . 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 GNU Touche d'échappement de l'écran
  • 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

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 également consulter setsid et start-stop-daemon, mais les autres méthodes devraient suffire.

84
con-f-use

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 tel est le cas, lorsque vous exécuterez la commande "normalement", vous remarquerez que le programme graphique démarre et "quitte".


Voici n 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 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 .

25
Roger Pate

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

firefox &!
22
Rick

Utilisez 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 le manpage

Par exemple:

Nohup gedit something
20
Florian Diesch

Ouvrez le terminal, tapez screen, tapez la commande que vous voulez exécuter, fermez le terminal. Le programme doit continuer à s'exécuter dans la session écran GN.

4
RobinJ

Cela a fonctionné pour moi:

$ (Nohup gedit 2>/dev/null &)
1
wesleycoder

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
1
Jonathan Komar

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.

0
Lokesh Devnani

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 &'
0
Sam

Cela a fonctionné pour moi:

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

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