Question Comment démarrer des programmes linux d'interface graphique à partir de la ligne de commande, mais séparément de la ligne de commande?


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

Dans Windows, si une fenêtre de la console est ouverte, tapez winmineet appuyez sur Entrée, le démineur apparaîtra, complètement séparé du programme cmd. L'instance de Minesweeper n'est pas liée à l'invite de commande, à ma connaissance, à l'exception du parent de Minesweeper défini sur cette instance de l'invite de commandes. C'est différent sous Linux, cependant.

Sous Linux, si une fenêtre de la console est ouverte, tapez 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 peux plus utiliser la ligne de commande tant que cette instance d'Emacs n'est pas fermée. Existe-t-il un moyen de répliquer le comportement de Windows sous Linux?

Merci!


84
2017-08-18 03:22


origine


dup de:superuser.com/questions/178587/ - behrooz
veuillez donner la réponse à geekosaur. - Joshua Robison
dans windows7 c'est minesweeper.exe ici C: \ Program Files \ Microsoft Games \ Minesweeper donc minesweeper.exe ne fonctionnera généralement pas .. comme ce répertoire n'est pas dans le chemin .. Et de toute façon, vous devriez indiquer la version de Windows - barlop


Réponses:


Dans bash, detach est un intégré, utilisé comme suit:

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

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

emacs &|

7
2018-03-04 00:33





Ajouter & à la ligne de commande:

emacs &

Cela 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 sortira également d'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 apparaîtront sur le terminal. Pour éviter cela, utilisez:

(emacs &> /dev/null &)

103
2017-08-18 03:25



C'est exactement ce que je voulais. Merci!
J'aime particulièrement le conseil (emacs &).
Si vous avez déjà démarré la tâche (emancs), utilisez CTRL-Z pour mettre en veille puis utilisez la commande "bg" pour l'envoyer en arrière-plan. - Jayan
@StackTrace: si vous faites cela, et que vous fermez votre terminal, il va également tuer Emacs. - Nathan Fellman
OK .. J'avais l'habitude d'utiliser "nohup" détacher cela. Cela ne peut pas être fait une fois le processus démarré ... - Jayan


Utilisation nohup. Comme ça: nohup amarok &

J'espère que cela t'aides.


18
2017-08-18 03:26





Je posté une réponse à un sujet plus ancien de sujet similaire avec des réponses de diverses sources. Voici une copie de cette réponse adaptée à ce sujet.


Travaux suivants:

$ (gui_app &> /dev/null &)

Ceci est la réponse de Nathan Fellman plus la redirection.

"&> / dev / null" redirige à la fois stdout et stderr vers le périphérique nul. La dernière esperluette exécute le processus en arrière-plan. Les parenthèses autour de la commande entraîneront l'exécution de votre "gui_app" dans un sous-shell.

Faire cela détachera le processus "gui_app" de la console à partir de laquelle vous exécutez cette commande. Donc, même si vous fermez la fenêtre dans laquelle l'émulateur de terminal parent est exécuté, "gui_app" ne se ferme pas. J'ai couru ceci puis regardé l'arborescence de processus avec la commande "pstree" et ai trouvé une application démarrée de cette manière deviendra le processus enfant à "init".

Par exemple,

$ gui_app &> /dev/null &

va exécuter l'application en arrière-plan, mais il deviendra un processus enfant du processus de la console et se terminera lorsque vous fermez le terminal. (Bien que quitter le terminal via bash en utilisant la commande exit ou Ctrl-D laissera bash nettoyer en remettant le processus en arrière-plan à init.)

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

$ gui_app &
$ disown

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

Quelques références: Processus de révocation (outils électriques UNIX)

Si c'est un simple appel à une application graphique - sans options compliquées et autres -, il semble utiliser un lanceur comme "gmrun" ou menu (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é les deux.

NOTE: CarlF dans le commentaires de l'autre thread rapports Les applications GUI démarrées via la méthode "gui_app &" ne se ferment pas quand il quitte le terminal parent. Je pense que nous fermions le terminal de différentes manières. Je fermais la fenêtre dans laquelle l'émulateur de terminal était exécuté. Je pense qu'il est peut-être sorti de l'émulateur de terminal via le shell (commande de sortie ou Ctrl-D). J'ai testé cela et j'ai vu que quitter via bash n'arrête pas l'interface graphique en tant que processus d'arrière-plan du terminal, comme le dit CarlF. Il semble que les processus en arrière-plan soient initiés à init quand il a la possibilité de nettoyer. En fait, cela doit être le mécanisme par lequel le processus d'arrière-plan démarré dans un sous-shell est transféré à init.


18
2018-04-03 21:19





Essayez de taper xemacs & pour ouvrir XEmacs en arrière-plan.

S'il vous plaît, ne vous référez pas à cela comme "émulation du comportement de Windows". Aie.

Vous pouvez aussi:

  • Ouvrir un nouveau terminal
  • Utilisez Alt + F2 ou votre gestionnaire de fenêtres pour lancer le programme, au lieu d’utiliser le terminal
  • Utiliser l'écran GNU

9
2017-08-18 03:24





util-linux inclut un outil appelé setsid qui fait ce que détachement fait:

$ setsid someprogram

Cela fonctionnera someprogram dans une nouvelle session.


9
2018-05-12 10:06





Je mets le code suivant dans un fichier script exécutable nommé "sbg" pour "background silencieux". Il fait tout le nécessaire pour déconnecter complètement le programme lancé depuis le shell: redirige stdin, stdout et stderr de / vers /dev/null, ignore les raccords, s'exécute en arrière-plan et se détache.

#!/bin/bash
nohup "$@" &>/dev/null & disown %%

Alors vous pouvez juste faire sbg emacs. Vous pouvez également transmettre les arguments que vous souhaitez: sbg emacs --daemon FILE1 FILE2.


7
2018-04-05 07:11



la solution de script a fonctionné le mieux pour moi. Merci!! bien que j'ai utilisé (gui_app &> /dev/null &) à la place (réponse de @ EMPraptor) - Jimi Oke


command &

Placez une esperluette après la commande.


3
2017-08-18 03:25





Si vous utilisez bash, vous pouvez rejeter le processus:

% firefox &
% disown 

3
2018-03-04 00:16





Vous pouvez utiliser cette seule ligne:

$ emacs & disown

2
2017-08-06 03:29