92 votes

Comment démarrer des programmes linux GUI à partir de la ligne de commande, mais séparément de la ligne de commande ?

J'ai déjà cherché cette question, mais je n'ai jamais pu trouver de réponse.

Dans Windows, si j'ai une fenêtre de console ouverte, tapez winmine et appuyez sur Entrée, Minesweeper apparaîtra, complètement séparé du programme cmd. L'instance de Minesweeper n'est pas liée à l'invite de commande de quelque manière que ce soit, à l'exception du parent de Minesweeper qui est défini à cette instance de l'invite de commande. C'est différent sous Linux, cependant.

Sous Linux, si j'ai une fenêtre de console ouverte, je tape emacs et appuyez sur entrée, Emacs s'ouvre, mais il semble lié à la ligne de commande. Plus précisément, il semble que je ne puisse plus utiliser la ligne de commande tant que cette instance d'Emacs n'est pas fermée. Existe-t-il un moyen de reproduire le comportement de Windows sous Linux ?

Merci !

113voto

Nathan Fellman Points 8972

Ajouter & sur la ligne de commande :

emacs &

Ceci mettra emacs en arrière-plan et vous permettra de continuer à utiliser votre terminal.

Notez que cela laissera toujours emacs comme un sous-processus de votre terminal, et quand vous quitterez le terminal, il quittera également emacs. Pour éviter cela, tapez :

(emacs &)

Les parenthèses indiquent au terminal de détacher le processus emacs du terminal.

Néanmoins, les messages stdout et stderr du programme s'afficheront sur le terminal. Pour éviter cela, utilisez :

(emacs &> /dev/null &)

21voto

chuck Points 21

Utilisez nohup . Comme ça : nohup amarok &

J'espère que cela vous aidera.

19voto

EMPraptor Points 376

J'ai posté une réponse à un fil de discussion plus ancien sur un sujet similaire avec des réponses provenant de diverses sources. Vous trouverez ci-dessous une copie de cette réponse adaptée à ce fil.


Travaux suivants :

$ (gui_app &> /dev/null &)

C'est la réponse de Nathan Fellman plus la redirection.

"&> /dev/null" redirige stdout et stderr vers le périphérique null. La dernière esperluette fait tourner le processus en arrière-plan. Les parenthèses autour de la commande feront en sorte que votre "gui_app" s'exécute dans un sous-shell.

En faisant cela, le processus "gui_app" sera détaché de la console à partir de laquelle vous exécutez cette commande. Ainsi, même si vous fermez la fenêtre dans laquelle l'émulateur de terminal parent est exécuté, "gui_app" ne se fermera pas. J'ai exécuté cette commande puis j'ai regardé l'arbre des processus avec la commande "pstree" et j'ai trouvé qu'une application démarrée de cette façon deviendra un processus enfant de "init".

Par exemple,

$ gui_app &> /dev/null &

exécutera l'application en arrière-plan, mais elle deviendra un processus enfant du processus de la console et se terminera lorsque vous fermerez le terminal. (Bien que quitter le terminal à travers bash en utilisant la commande exit ou Ctrl-D permettra à bash de faire le ménage en confiant le processus d'arrière-plan à init).

"nohup" fonctionne comme NawaMan l'a suggéré, mais cela redirige la sortie et l'erreur vers un fichier par défaut. Comme JeffG l'a répondu, la commande "disown" (si elle est disponible dans Shell) peut détacher le processus du terminal après avoir lancé un processus en arrière-plan :

$ gui_app &
$ disown

(BTW tout ceci s'applique à bash. Je suis sûr que d'autres shells ont d'autres méthodes/syntaxe pour faire cela).

Quelques références : Désactiver les processus (Outils puissants d'UNIX)

S'il s'agit d'un simple appel à une application GUI - sans options compliquées et autres - il semble que l'utilisation d'un lanceur comme "gmrun" ou dmenu (avertissement : audio fort) est également une bonne option. Liez-le à une combinaison de touches. Je n'utilise pas encore de lanceur mais j'ai essayé ces deux-là.

NOTE : CarlF dans le commentaires de l'autre fil rapporte que les applications GUI démarrées via la méthode "gui_app &" ne se ferment pas lorsqu'il quitte le terminal parent. Je pense que nous fermions le terminal de manière différente. Je fermais la fenêtre dans laquelle l'émulateur de terminal était exécuté. Je pense qu'il a peut-être quitté l'émulateur de terminal par le biais du Shell (commande exit ou Ctrl-D). J'ai testé cela et j'ai vu que sortir par bash n'arrête pas l'interface graphique démarrée comme processus d'arrière-plan du terminal comme le dit CarlF. Il semble que bash transfère les processus d'arrière-plan à init lorsqu'il a la possibilité de faire le ménage. En fait, cela doit être le mécanisme par lequel le processus d'arrière-plan lancé dans un sous-shell est transféré à init.

13voto

geekosaur Points 11085

Sur bash , detach est un élément intégré, utilisé comme suit :

emacs &
detach %+ # or % + the number in brackets printed after the above

Sur zsh vous pouvez mettre en arrière-plan et détacher en une seule opération :

emacs &|

11voto

harshadura Points 1

Util-linux inclut un outil appelé setsid qui fait essentiellement ce que fait detach :

$ setsid someprogram

Cela fonctionnera someprogram dans une nouvelle session.

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