J'ai déjà cherché cela, mais je n'ai jamais trouvé de réponse.
Sous Windows, si une fenêtre de console est ouverte, tapez winmine
et appuyez sur Entrée. Minesweeper apparaîtra, complètement distinct du programme cmd. L'instance Minesweeper n'est pas liée à l'invite de commande de quelque manière que ce soit à ma connaissance, à l'exception du parent de Minesweeper qui est défini sur l'instance de la commande Invite. C'est différent sous Linux, cependant.
Sous Linux, si une fenêtre de console est ouverte, tapez emacs
et appuyez sur Entrée. Emacs s'ouvrira, mais cela 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 répliquer le comportement Windows sous Linux?
Merci!
Dans bash
, detach
est intégré, utilisé comme suit:
emacs &
detach %+ # or % + the number in brackets printed after the above
Dans zsh
, vous pouvez détacher et détacher en une seule opération:
emacs &|
Ajoutez &
à 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 en tant que sous-processus de votre terminal, et lorsque 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.
Les messages stdout et stderr du programme seront toujours affichés sur le terminal. Pour éviter cela, utilisez:
(emacs &> /dev/null &)
Utilisez Nohup
. Comme ceci: Nohup amarok &
J'espère que cela t'aides.
J'ai posté une réponse à un fil plus ancien de sujets similaires avec des réponses de différentes sources. Voici 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 perluète rend le processus exécuté en arrière-plan. Les parenthèses autour de la commande font que votre "gui_app" s'exécute dans un sous-shell.
Cela détachera le processus "gui_app" de la console à partir de laquelle vous exécutez cette commande. Ainsi, même si vous fermez l'émulateur de terminal parent de la fenêtre en cours d'exécution, "gui_app" ne se ferme pas. J'ai couru cela puis regardé l'arbre des processus avec la commande "pstree" et trouvé une application démarrée de cette façon deviendra un processus enfant pour "init".
Par exemple,
$ gui_app &> /dev/null &
exécutera l'application en arrière-plan, mais deviendra un processus enfant du processus de la console et se terminera à la fermeture du terminal. (Bien que quitter le terminal par bash en utilisant la commande exit ou Ctrl-D laissera bash nettoyer en laissant 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 a répondu, la commande "désaveu" (si 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 cela s'applique à bash. Je suis sûr que d'autres shells utilisent d'autres méthodes/syntaxe pour le faire.)
Quelques références: Processus de désaveu (UNIX Power Tools)
S'il s'agit d'un simple appel à une application graphique - sans options compliquées et autres - il semble que l'utilisation d'un lanceur tel que "gmrun" ou dmenu (avertissement: audio fort) est également une bonne option. Liez-le à une combinaison de touches. Je n'ai pas encore utilisé de lanceur, mais j'ai essayé ces deux-là.
REMARQUE: CarlF dans les commentaires de l'autre thread signale que les applications de l'interface graphique lancé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 différentes manières. Je fermais la fenêtre dans laquelle l'émulateur de terminal s'exécutait. 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 vu que quitter via bash n'arrête pas l'interface utilisateur graphique en tant que processus d'arrière-plan du terminal, comme le dit CarlF. Il semble que bash bas les processus d'arrière-plan pour commencer quand il est donné la chance de nettoyer. En fait, il doit s'agir du mécanisme par lequel le processus d'arrière-plan démarré dans un sous-shell est transmis à init.
util-linux inclut un outil appelé setsid qui fait essentiellement ce que detach fait:
$ setsid someprogram
Ceci va exécuter someprogram
dans une nouvelle session.
Essayez de taper xemacs &
pour ouvrir XEmacs en arrière-plan.
Ne faites pas référence à cela en tant que "comportement émulé de Windows". Aie.
Vous pourriez aussi:
J'ai mis le code suivant dans un fichier de script exécutable nommé "sbg" pour "fond silencieux". Il fait tout ce qui est nécessaire pour déconnecter complètement le programme en cours de démarrage du shell: redirige stdin, stdout et stderr de/vers /dev/null
, ignore les blocages, s’exécute en arrière-plan et se détache.
#!/bin/bash
Nohup "$@" &>/dev/null & disown %%
Ensuite, vous pouvez simplement faire sbg emacs
. Vous pouvez également transmettre tous les arguments que vous souhaitez: sbg emacs --daemon FILE1 FILE2
.
si vous utilisez bash, vous pouvez désavouer le processus:
% firefox &
% disown
command &
Mettez une esperluette après la commande.
Vous pouvez utiliser cette seule ligne:
$ emacs & disown
Comme le disent les autres réponses, vous pouvez utiliser les éléments suivants:
$ emacs &
Si vous oubliez le &
, appuyez simplement sur Ctrl-z
puis utilisez bg
:
[1]+ Stopped emacs
$ bg
[1]+ emacs &
$
FYI: Ctrl-z
arrête le processus emacs et bg
envoie en arrière-plan.
Mettez ceci dans votre ~/.bashrc
:
debug_trap_skip()
{
local cmd_type=$(type -t "$1")
# Empty cmd_type is for inexistent command or variable definition, exclude them
# and Shell builtins except echo, set and env:
[[ -z "$cmd_type" || "$cmd_type" = builtin && "$1" != echo && "$1" != set && "$1" != env ]] &&
return 0
return 1
}
debug_trap_x11()
{
if ldd `which $1`|grep -q libX11
then
setsid "$@"
return 0
fi
return 1
}
debug_trap()
{
[[ -n "$COMP_LINE" ]] && return # do nothing if completing
[[ "$BASH_COMMAND" = "$Prompt_COMMAND" ]] && return
debug_trap_skip $BASH_COMMAND && return 0
debug_trap_x11 $BASH_COMMAND && return 1
return 0
}
shopt -s extdebug
trap debug_trap DEBUG
Maintenant, vous n'avez plus besoin de vous rappeler quels programmes sont X11 et de faire des manipulations spéciales pour eux, car ils se détacheront automatiquement. Notez que setsid
est meilleur que Nohup
car le dernier bloque le signal HUP qui n’est pas ce dont vous avez besoin.
P.S. Maintenant, vous êtes winmine
- prêt sous Linux.
en utilisant simplement &
comme dans $ x &
laisse le processus attaché au terminal, j’ai ramassé un petit programme appelé detach
http://inglorion.net/software/detach/ que j’ai aliasé comme d
c’est un peu comme Nohup
mais ne laisse pas de fichier journal, je l'utilise pour détacher mupdf : d mupdf x.pdf