362 votes

Comment détacher entièrement un processus de Terminal ?

J'utilise Tilda (terminal déroulant) sur Ubuntu comme ma "centrale de commande" - à peu près comme d'autres pourraient utiliser GNOME Do, Quicksilver ou Launchy.

Cependant, je ne sais pas comment détacher complètement un processus (par exemple Firefox) du terminal à partir duquel il a été lancé, c'est-à-dire empêcher qu'un tel processus (non-)enfant

  • se termine par la fermeture du terminal d'origine
  • "pollue" le terminal d'origine via STDOUT/STDERR

Par exemple, afin de démarrer Vim dans une fenêtre de terminal "correcte", j'ai essayé un simple script comme le suivant :

exec gnome-terminal -e "vim $@" &> /dev/null &

Cependant, cela entraîne toujours une pollution (de même, le fait de passer un nom de fichier ne semble pas fonctionner).

1 votes

C'est aussi une bonne question. Je pense qu'il est juste de considérer Bash comme un langage de programmation - bien que la portée de cette question soit probablement plus du côté des administrateurs système...

0 votes

Il s'agit d'un duplicata de cette question stackoverflow.com/questions/285015/

0 votes

3voto

B. Branchard Points 31

Ajoutez simplement ceci dans votre bashrc/zshrc :

detach() {
  "$@" 1>/dev/null 2>/dev/null &; disown
}

Ensuite, vous pouvez exécuter des commandes désaffectées comme ceci :

detach gedit ~/.zshrc

0 votes

Sous bash, vous pouvez simplement faire &> /dev/null

2voto

Volker Stolz Points 121

Essayez démon -- devrait être disponible dans votre gestionnaire de paquets et prendre en charge toutes les manières de se dissocier du terminal.

1voto

ryan Points 523

Dans mon .bashrc, j'ai ces fonctions dans ce but précis :

function run_disowned() {
    "$@" & disown
}

function dos() {
    # run_disowned and silenced

    run_disowned "$@" 1>/dev/null 2>/dev/null
}

Préfixe une commande avec dos pour le lancer en mode détaché depuis le terminal.

La fonction est écrite pour fonctionner avec bash y zsh .

2 votes

Je suis un peu confus quant à la raison pour laquelle cette réponse utilise une fonction enveloppée dans une autre, alors qu'il suffit d'utiliser une fonction avec un corps comme ceci : ( "$@" & disown) &> /dev/null . Il n'est pas non plus très logique d'utiliser 1> y 2> parce que vous utilisez disown ce qui signifie que vous utilisez bash, et dans bash vous pouvez facilement faire &> pour rediriger à la fois stdout et stderr

0 votes

Il s'agit de deux fonctions car (1) je pense que c'est plus facile à lire de cette façon, et (2) j'ai besoin de la fonction run_disowned dans d'autres endroits de mes dotfiles. Vous avez raison au sujet de la &> chose, bien sûr.

1voto

reox Points 1444

kstart5 de KDE, disponible dans le paquet kde-cli-tools peut aider

kstart5 my-command &

Nous pouvons également gérer plusieurs aspects d'une fenêtre x si nous utilisons une interface graphique.


Fuentes: Linuxhacks.org
Divulgation : Je suis le propriétaire de Linuxhacks.org.

1voto

Nikolas Points 11

Pour détacher complètement votre programme de votre session SSH actuelle, exécutez :

setsid nohup script.sh &

et pour rediriger tous les journaux (stderr & stdout), vous pouvez exécuter :

setsid nohup script.sh &>/tmp/script.log &

Pour vérifier si votre processus a été détaché, exécutez :

ps -efj --forest

et regarder l'arbre de processus hiérarchique.

0 votes

Je suis assez confus en voyant que vous avez mis setsid et nohup ensemble. Nous pouvons exécuter setsid avec l'option -f afin qu'il soit toujours exécuté dans un nouveau processus. Si vous ne voulez pas que nohup s'imprime toujours dans le terminal, utilisez votre deuxième méthode (vous pouvez également supprimer la partie setsid). Y a-t-il quelque chose que je ne sais pas ?

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