Quelles sont les différences entre
$ nohup foo
et
$ foo &
et
$ foo &
$ disown
shell
nohup
job-control
disown
lesmana
la source
la source
foo &!
ce qui devrait être égal à le renier dès le début.foo & disown
désavouer immédiatement.setsid
, et comment cela se rapporte àdisown
etnohup
Réponses:
Voyons d'abord ce qui se passe si un programme est lancé à partir d'un shell interactif (connecté à un terminal) sans
&
(et sans aucune redirection). Supposons donc que vous venez de taperfoo
:foo
est créé.SIGHUP
, il envoie également un messageSIGHUP
au processus (ce qui entraîne normalement la fin du processus).Maintenant, regardons ce qui se passe si vous mettez le processus en arrière-plan, c'est à dire, tapez
foo &
:foo
est créé.jobs
et est accessible à l'aide de%n
(oùn
est le numéro de travail).fg
, auquel cas il continue comme si vous ne l' utilisiez pas&
(et s'il a été arrêté en raison d'une tentative de lecture depuis une entrée standard, il peut maintenant passer à la lecture depuis le terminal).SIGHUP
, il envoie également un messageSIGHUP
au processus. En fonction du shell et éventuellement des options définies pour le shell, lorsqu’il se termine, il envoie également un messageSIGHUP
au processus.disown
Supprime maintenant le travail de la liste des travaux du shell, afin que tous les sous-points ci-dessus ne s'appliquent plus (y compris le processus envoyéSIGHUP
par le shell). Cependant, notez qu'il est toujours connecté au terminal, donc si le terminal est détruit (ce qui peut se produire s'il s'agissait d'un pty, comme ceux créés parxterm
oussh
, et si le programme de contrôle est arrêté, en fermant xterm ou en mettant fin à la connexion SSH ) , le programme échouera dès qu’il essaiera de lire à partir d’une entrée standard ou d’écrire sur une sortie standard.En
nohup
revanche, il convient de séparer efficacement le processus du terminal:EOF
).nohup.out
afin que le programme n'échoue pas pour l'écriture sur la sortie standard en cas d'échec du terminal. Ainsi, le processus écrit n'est pas perdu.SIGHUP
(donc le nom).Notez que
nohup
cela ne supprime pas le processus du contrôle du travail du shell et ne le met pas non plus en arrière-plan (mais comme unnohup
travail en avant-plan est plus ou moins inutile, vous le mettriez généralement en arrière-plan&
). Par exemple, contrairement à withdisown
, le shell vous indiquera quand même le travail nohup (sauf si le shell est terminé avant, bien sûr).Donc, pour résumer:
&
met le travail en arrière-plan, c’est-à-dire qu’il bloque les tentatives de lecture des entrées et empêche le shell d’attendre son achèvement.disown
supprime le processus du contrôle de travail du shell, mais le laisse toujours connecté au terminal. L’un des résultats est que le shell ne l’enverra pasSIGHUP
. De toute évidence, il ne peut être appliqué qu'aux tâches en arrière-plan, car vous ne pouvez pas y entrer lorsqu'un travail de premier plan est en cours d'exécution.nohup
déconnecte le processus du terminal, redirige sa sortie versnohup.out
et le protègeSIGHUP
. L'un des effets (celui de la dénomination) est que le processus ne recevra aucun message envoyéSIGHUP
. Il est complètement indépendant du contrôle des travaux et pourrait en principe être utilisé également pour les travaux au premier plan (bien que cela ne soit pas très utile).la source
nohup
seul n’empêche pas un processus google-chrome d’être fermé, alors que le terminal à partir duquel il a été démarré est fermé ?disown %1
etdisown -h %1
? Le second restera comme un travail normal (mais ignore le signal HUP) jusqu'à la sortie du terminal?(foo&)
sous - shellL'utilisation
&
du programme s'exécute en arrière-plan. Vous obtiendrez une nouvelle invite du shell au lieu de bloquer jusqu'à la fin du programme.nohup
etdisown
sont en grande partie indépendants; ils suppriment les signaux SIGHUP (raccrochage) afin que le programme ne soit pas automatiquement tué lorsque le terminal de contrôle est fermé.nohup
fait cela quand le travail commence. Si vous ne faites pasnohup
un travail quand il commence, vous pouvez utiliserdisown
pour modifier un travail en cours d'exécution; sans aucun argument, il modifie le travail en cours, qui est celui qui vient d'être mis en arrière-planla source
nohup
etdisown
on peut dire que les deux supprimentSIGHUP
, mais de différentes manières.nohup
fait que le programme ignore initialement le signal (le programme peut le changer).nohup
essaie également de faire en sorte que le programme ne dispose pas d'un terminal de contrôle, de sorte qu'il ne soit pas envoyéSIGHUP
par le noyau lorsque le terminal est fermé.disown
est purement interne à la coquille; le shell n’envoie pas à laSIGHUP
fin.disown
retrait du travail de la liste des travaux. Si vous ne spécifiez pas d'option, elle est supprimée de la liste des tâches. Cependant , si vous spécifiez l'-h
option, chaque spécification de travail n'est pas supprimée de la table. Au lieu de cela, cela signifie que le fichierSIGHUP
n’est pas envoyé au travail si le shell reçoit unSIGHUP
.&
ne vous donne pas un terminal, il se détachestdin
du processus et le fait fonctionner en arrière-plan, mais les deuxstdout
etstderr
sont toujours attachés au tty actuel. Cela signifie que vous pouvez mélanger le texte de différents programmes, ce qui peut être assez gênant si vous le faitesgimp &
et obtenez beaucoup d'erreurs GTK + tout en essayant d'utiliser ce tty pour autre chose.Voici mon expérience d’essayer d’exécuter soffice en arrière-plan, à la suite d’une commande qui ne se termine pas (par exemple
tail
). Pour cet exemple, je vais utilisersleep 100
.Et
nohup .. &
et désavoué
setsid .. &
Pour économiser de l'espace::
nohup setsid ..
ne montre pas les journaux / soffice N'ARRÊTE PAS le Ctrl-Cnohup
avec& disown
à la fin: ne montre pas les journaux / le soffice s'arrête sur Ctrl-Cla source
nohup ⟨command⟩ & disown
le processus créé ne s’arrête pasCtrl+C
.soffice
?soffice
la commande semble avoir quelque chose de différent. J'ai donc envisagé de l'ajouter ici à titre d'exception à la règle. par exemple, lors de l'utilisation de :, le fait d'nohup .. &
appuyerCtrl-c
normalement ne provoque pas l'arrêt de la commande, mais avecsoffice
elle. J'attends que quelqu'un marche dessus et explique pourquoi cela se produit avec soffice :)nohup soffice &
et presséCtrl+C
. Rien ne s'est passé, comme prévu.