J'ai émis la ^z; bg; disown
séquence afin de me permettre de fermer une session ssh dans laquelle j'exécute un processus de longue durée super important. Ce processus écrit la sortie d'état dans stderr, et il a continué à le faire même après avoir été détaché (vérifié avec lsof, le stderr fd est ouvert pour r / w).
Existe-t-il un moyen de déterminer que le processus a bien été renié (ne récupérera pas SIGHUP si le shell en récupère un)?
Réponses:
Dans Bash, la
disown
commande émise d'elle-même supprimera les processus en arrière-plan (viabg
ou&
) de la table de travaux active et les marquera pour ne pas recevoir de SIGHUP à la déconnexion.Vous pouvez également passer un ou plusieurs travaux à désavouer, comme
disown 1 3
. L'disown -h
indicateur est utile si vous souhaitez conserver les travaux dans la table, mais toujours pas SIGHUP à la déconnexion.Vous pouvez afficher la table des travaux en exécutant la
jobs
commande. Après un fond réussi, cela se verra[1]+ command &
. Après avoir désavoué un travail, il ne devrait plus s'afficher dans la table des travaux et ne plus être supprimé à la déconnexion. Vous pouvez toujours le processus par l' intermédiaireps ux
,top
et d' autres utilitaires de visualisation processus.Une fois qu'une tâche a été supprimée, vous pouvez attendre qu'elle se termine naturellement ou envoyer un signal via
kill
le PID pour l'arrêter.Parce que Bash supprime simplement le travail de la liste des travaux en cours pour terminer et que les poignées de fichier vers la sortie standard et la sortie de votre terminal sont toujours ouvertes, vous continuerez à recevoir la sortie du travail jusqu'à ce que votre terminal soit fermé (lorsque vous vous déconnectez) .
Exemples:
Je n'utilise généralement que
disown
si j'exécute une commande potentiellement longue comme unrsync
oucp
et décide ensuite que je dois me déconnecter sans y mettre fin. Si vous savez que vous allez exécuter une commande et vous déconnecter, vous pouvez capturer la sortie en canalisant ou en l'tee
intégrant dans un fichier, en l'exécutant avecnohup
ou en l'exécutantscreen
(ce qui vous permet de reprendre la propriété de la commande / de terminer ensuite ).Exemples:
la source
detach
un travail en arrière-plan, il va être détaché :) il n'y a pas vraiment de terrain d'entente où l'exécuter sur un processus en arrière-plan ne fera rien. la vérificationjobs
vérifie simplement que vous n'avez pas essayé de détacher un processus arrêté ou quelque chose.