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


89

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 winmineet 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 cette instance de l'invite de commande. C'est différent sous Linux, cependant.

Sous Linux, si une fenêtre de console est ouverte, tapez emacset 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!



s'il vous plaît donner la réponse à geekosaur.
Joshua Robison

dans windows7 c'est minesweeper.exe ici C: \ Program Files \ Microsoft Jeux \ Minesweeper afin que minesweeper.exe ne fonctionne généralement pas .. car ce répertoire n'est pas dans le chemin .. Et de toute façon, vous devez indiquer la version de Windows
barlop

Réponses:


10

In bash, detachest 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 &|

108

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 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 &)

9
J'aime particulièrement le (emacs &) tip.

1
si vous avez déjà lancé la tâche (emancs), utilisez CTRL-Z pour mettre en veille, puis utilisez la commande "bg" pour envoyer en arrière-plan.
Jayan

@StackTrace: si vous faites cela et que vous fermez votre terminal, cela tuera aussi emacs.
Nathan Fellman le

1
OK .. J'avais l'habitude d'utiliser "nohup" détachez ceci. Cela ne peut plus être fait une fois le processus lancé ...
Jayan le

En appuyant sur Ctrl+ Cdans la fenêtre du terminal, cette commande a été émise, le processus est tué: <
Richard de Wit

21

Utilisez nohup. Comme ça:nohup amarok &

J'espère que cela t'aides.


19

J'ai posté une réponse sur 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 à la fois 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 feront que votre "gui_app" s’exécutera 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 passant 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 un 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 ont d'autres méthodes / syntaxes 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 (warning: un son puissant ) soit é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 graphiques 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 s'exécutait l'émulateur de terminal. 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.


11

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

$ setsid someprogram

Cela fonctionnera someprogramdans une nouvelle session.


9

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 l'écran GNU

7

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 démarré 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 passer des arguments que vous souhaitez: sbg emacs --daemon FILE1 FILE2.


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


3

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

% firefox &
% disown 


1

Comme le disent les autres réponses, vous pouvez utiliser les éléments suivants:

$ emacs &

Si vous oubliez &cela, appuyez simplement sur Ctrl-zpuis utilisez bg:

[1]+  Stopped                 emacs
$ bg
[1]+ emacs &
$

FYI: Ctrl-zarrête le processus emacs et bgenvoie en arrière-plan.


0

en utilisant simplement en &tant que $ 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 dc'est un peu comme nohupmais ne laisse pas derrière un fichier journal i utilisez-le pour détacher mupdf :d mupdf x.pdf


0

Mettez ceci à 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 ni de faire des manipulations spéciales à leur place car ils se détacheront automatiquement. Notez que setsidc'est mieux que nohupparce que le dernier bloque le signal HUP, ce qui n'est pas ce dont vous avez besoin.

PS Maintenant, vous êtes winmineprêt pour Linux.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.