web-dev-qa-db-fra.com

Comment démarrer les programmes linux GUI à 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 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!

86
Jason

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 &|
10
geekosaur

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 &)
107
Nathan Fellman

Utilisez Nohup. Comme ceci: Nohup amarok &

J'espère que cela t'aides.

19
NawaMan

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.

18
EMPraptor

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.

10
tonybaldwin

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:

  • Ouvrir un nouveau terminal
  • Utilisez Alt + F2 ou votre gestionnaire de fenêtres pour lancer le programme au lieu d'utiliser le terminal.
  • Utiliser GNU Screen
9
Borealid

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.

7
Ryan Thompson

si vous utilisez bash, vous pouvez désavouer le processus:

% firefox &
% disown 
3
JeffG
command &

Mettez une esperluette après la commande.

3
Jesse Dhillon

Vous pouvez utiliser cette seule ligne:

$ emacs & disown
2
Idham Perdameian

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.

1
MatthewD

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.

0
midenok

en utilisant simplement & comme dans $ x & laisse le processus attaché au terminal, j’ai ramassé un petit programme appelé detachhttp://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

0
Dan D.