Cette question est ancienne et je ne comprends toujours pas pourquoi.
Question initiale en 2014:
Dans un onglet Gnome Terminal, j'ai couru
$ nohup chromium-browser &
Mais lorsque je ferme l'onglet du terminal, il chromium-browser
se ferme également. N'est-ce pas nohup
censé empêcher ça? Gilles a dit:
on peut dire que nohup et renié suppriment SIGHUP, mais de différentes manières. nohup oblige le programme à ignorer le signal initialement (le programme peut changer cela). nohup essaie également de faire en sorte que le programme ne dispose pas d'un terminal de contrôle, afin qu'il ne soit pas envoyé SIGHUP par le noyau lorsque le terminal est fermé. l'aveuglement est purement interne à la coquille; il empêche le shell d'envoyer SIGHUP lorsqu'il se termine.
Donc, rien ne fait-il que Chrome-Browser ignore SIGHUP?
Je vois cela sur d'autres exécutables, tels que et Emacs (mode GUI). Mais pas sur xeyes.
Cela se produit sur Ubuntu 12.04, 32 bits lorsque la question a été publiée.
Mise à jour en 2015,
Maintenant, j'utilise Ubuntu 14.04, avec google-chrome
au lieu d'être chromium-browser
installé. La même chose qui est arrivée à Chrome-Browser auparavant arrive également à Google-Chrome maintenant. nohup google-chrome 2>/dev/null &
ne l'empêche pas d'être fermé lorsque l'onglet du terminal est fermé. /usr/bin/google-chrome
est un lien vers un script bash /opt/google/chrome/google-chrome
. Pourquoi nohup
le script bash ne fonctionne-t-il pas? Comment pouvons-nous le faire fonctionner sur les scripts bash? Et les scripts Python?
xeyes
.Réponses:
Lorsque vous fermez une fenêtre de terminal GNOME, un SIGHUP est envoyé au shell qu'il exécutait. Le shell envoie généralement un SIGHUP à chaque groupe de processus qu'il sait qu'il a créé - même ceux qui ont commencé par
nohup
- puis quitte . Si le shell estbash
, il sautera l'envoi d'un SIGHUP à n'importe quel groupe de processus avec lequel l'utilisateur a marquédisown
.L'exécution d'une commande avec
nohup
fait ignorer SIGHUP, mais le processus peut changer cela. Lorsque la disposition de SIGHUP pour un processus est la valeur par défaut, alors s'il reçoit un SIGHUP, le processus sera interrompu.Linux fournit quelques outils pour examiner les paramètres de signal d'un processus en cours.
Le script shell chrome-browser fait une
exec
de l'application compilée, donc son ID de processus reste le même. Donc, pour voir ses paramètres de signal, j'ai courunohup chromium-browser &
, puis regardé/proc/$!/status
pour voir la disposition du signal.Ce sont des nombres hexadécimaux. Cela montre que SIGHUP n'est pas pris et n'est pas ignoré. Seul SIGPIPE (le 13e bit de SigIgn) est ignoré. J'ai tracé cela au code suivant :
Malgré le commentaire, les signaux ignorés par le parent ne le sont pas . Un SIGHUP tuera le chrome.
La solution consiste à faire ce que @ xx4h indique: utilisez la
disown
commande dans votre bash pour que, si bash doit quitter, il n'envoie pas SIGHUP auchromium-browser
groupe de processus. Vous pouvez écrire une fonction pour ce faire:la source
trap "" 1
, cela le ferait (et ses enfants) ignorer SIGHUP. Je vais clarifier cela.trap
commandes dans l'encapsuleur de script shell n'empêchent pas cela, et l'exécutionnohup
ne peut pas empêcher cela. Je vais réviser ma réponse pour refléter cela.Si
chromium-browser
c'est quelque chose commegoogle-chrome
ça, je pense que le problème le plus probable est que cechromium-browser
n'est pas le cas,chromium
mais c'est plutôt un shell-wrapper qui initialise l'état, puisexec
schromium
.Dans mon
google-chrome
installation, le binaire est situé dans/opt/google/chrome
et le wrapper/usr/bin
n'est qu'un script shell qui configure beaucoup d'environnement concernant lesxdg-*
valeurs par défaut et les chemins absolus et similaires avant de se remplacer par le binaire proprement dit.À ce stade, tous les signaux qui
nohup
pourraient avoir initialement ignoré au nom du script qu'il a appelé en tant qu'enfant cesseront de compter et à moins que le script wrapper ne prenne soin de l'arranger autrement (ce qui n'est pas le cas), le ctty est hérité.Essayez
file /usr/bin/chromium-browser
de vérifier s'il s'agit bien du script shell. Si oui, pensez à le réécrire pour mieux vous convenir.Je peux dire que le fait de le
google-chrome 2>/dev/null &
garder ouvert pour moi, mais je ne me souviens pas si c'est le résultat probable des modifications que j'ai apportées au script - c'était il y a plus d'un an.la source
chromium-browser
qu'avant s'est également produitegoogle-chrome
aujourd'hui. Je ne l'ai paschromium-browser
installé.nohup google-chrome 2>/dev/null &
ne l'empêche pas d'être fermé lorsque l'onglet du terminal est fermé.google-chrome
est un script bash/opt/google/chrome/google-chrome
. Pourquoi nohup appliqué à un script bash ne fonctionne-t-il pas? Comment pouvons-nous le faire fonctionner sur les scripts bash? Et les scripts Python?chrome
binaire.exec
sur lechrome
binaire actuel ? Comment puis-je modifier le script? Voici mon/opt/google/chrome/google-chrome
exec -a "$0" "$HERE/chrome" ... || exec -a "$0" "$HERE/chrome"
... En haut$HERE
est défini sur la valeur dereadlink $0
(qui est votre chemin d'installation pourgoogle-chrome
) mais/opt/google/chrome/chrome
est le binaire - qui est ce que le script se remplace.exec
probablement. Vous vous retrouverez avec un pid supplémentaire (au-delà de ses 1000 autres) et un processus shell en attente, mais je pense que c'est l'étendue de cela. Ou bien vous pourriez remplacerexec
w /nohup
peut - être. Tout dépend surtout de ce quichrome
sera toléré - mais cela devrait fonctionner comme ça.Le chrome semble spécial.
nohup chromium-browser & disown
devrait fonctionner dans ce cas. Voir aussi: /programming/11421810/nohup-doesnt-work-with-chromiumla source
nohup chromium-browser &
ça ne marche pas?