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

0voto

haseman Points 6071

J'ai constaté sur Mac OS X que je dois utiliser à la fois nohup ET disown pour m'assurer que le processus enfant n'est pas détruit avec le terminal.

0voto

Martyn Points 5662

J'utilise le script suivant pour faire cela. Il arrête le processus d'impression dans le terminal, le détache avec la touche nohup et quitte avec l'état de retour si la commande se termine dans le délai d'un an. TIMEOUT .

#!/bin/bash

TIMEOUT=0.1

CMD=( "$@" )
#Could have some shortcuts here, e.g. replace "somefile.c" with "gedit somefile.c"

#use nohup to run the command, suppressing its output and allowing the terminal to be closed
#also send nohup's output to /dev/null, supressing nohup.out
#run nohup in the background so this script doesn't block
#print the command for debugging and to see bash variable expansion
printf "%q " "${CMD[@]}"
echo
nohup "${CMD[@]}" >/dev/null 2>&1 &
NOHUP_PID=$!

#kill this script after a short time, exiting with success status - command is still running
#this is needed as there is no timeout argument for `wait` below
MY_PID=$$
trap "exit 0" SIGINT SIGTERM
sleep $TIMEOUT && kill $MY_PID 2>/dev/null & #ignore "No such process" error if this exits normally

#if the command finishes before the above timeout, everything may be just fine or there could have been an error
wait $NOHUP_PID
NOHUP_STATUS=$?
#print an error if there was any. most commonly, there was a typo in the command
[ $NOHUP_STATUS != 0 ] && echo "Error: $CMD"
#return the exit status of nohup, whatever it was
exit $NOHUP_STATUS

Exemple d'utilisation :

>>> run false
false
Error: false
>>> echo $?
1
>>> run true
true
>>> run sleep 10
sleep 10
>>>

0voto

kesarling He-Him Points 189

sudo apt install ucommon-utils

pdetach command

Et voilà :)

-1voto

haccks Points 99

De nombreuses réponses suggèrent d'utiliser nohup . Je suggère plutôt d'utiliser pm2 . Utilisation de pm2 sur nohup a de nombreux avantages, comme le maintien de l'application en vie, le maintien des fichiers journaux pour l'application et beaucoup d'autres fonctionnalités. Pour plus de détails regardez ça .

Pour installer pm2 vous devez télécharger npm . Pour les systèmes basés sur Debian

sudo apt-get install npm

et pour Redhat

sudo yum install npm

Ou vous pouvez suivre ces instructions . Après avoir installé npm l'utiliser pour installer pm2

npm install pm2@latest -g

Une fois que c'est fait, vous pouvez commencer votre demande en

$ pm2 start app.js              # Start, Daemonize and auto-restart application (Node)
$ pm2 start app.py              # Start, Daemonize and auto-restart application (Python)

Pour la surveillance des processus, utilisez les commandes suivantes :

$ pm2 list                      # List all processes started with PM2
$ pm2 monit                     # Display memory and cpu usage of each app
$ pm2 show [app-name]           # Show all informations about application

Gérez les processus en utilisant le nom de l'application ou l'identifiant du processus ou gérez tous les processus ensemble :

$ pm2 stop     <app_name|id|'all'|json_conf>
$ pm2 restart  <app_name|id|'all'|json_conf>
$ pm2 delete   <app_name|id|'all'|json_conf>

Les fichiers journaux se trouvent dans

$HOME/.pm2/logs #contain all applications logs

3 votes

L'utilisation d'une application NodeJS (par opposition à une petite commande robuste comme nohup) pour contrôler les processus unix semble ... vraiment exagérée, et pour être honnête, plutôt bizarre. J'utiliserais monit si vous avez besoin de la fonctionnalité de redémarrage.

0 votes

@Sergio c'est votre choix d'utiliser l'application déprécarisée.

0 votes

Plusieurs versions ont été faites cette année (une il y a 4 jours), donc je ne vois pas comment/pourquoi vous pourriez penser que monit est une application dépréciée. @see mmonit.com/monit/changes

-1voto

MattKelly Points 101

Si votre objectif est de lancer simplement une application en ligne de commande sans avoir à conserver la fenêtre du terminal, vous pouvez essayer de lancer l'application après avoir lancé le terminal avec alt-F2.

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