J'aidais un collègue qui avait des problèmes avec un processus d'arrière-plan en train de mourir par intermittence.
J'ai découvert qu'ils commençaient le processus d'arrière-plan en se connectant au serveur et en exécutant:
su - <user> -c '<command>' &
"Aha", m'exclamai-je. "Si vous démarrez une commande avec" & ", elle raccroche lorsque vous quittez le terminal de contrôle. Vous devez utiliser quelque chose comme nohup pour y parvenir. Vraiment, ce processus doit prendre en charge l'exécution en tant que démon, tut tut."
Nous avons testé la commande ci-dessus pour démontrer mon point et ... cela semblait fonctionner: le processus démarré par la commande ne s'est pas arrêté lorsque nous avons quitté le terminal qui exécutait la commande ci-dessus.
commande est un script Python personnalisé dont la sortie va vers un fichier. Autant que je sache, il n'y a pas de capacité de démonisation intelligente dans le script. Il ne fait rien des choses nécessaires pour fonctionner en tant que démon répertorié dans la page Wikipedia: Daemon (computing): Creation .
L'exécution de la commande se comporte comme prévu:
<command> &
exit
Dans le cas ci-dessus, le processus d'arrière-plan lancé par la commande se termine lorsque nous quittons le terminal.
Ma question est la suivante:
Que se passe-t-il lorsque nous ajoutons "su - -c &" qui empêche le processus de se terminer lorsque notre terminal se ferme. Je voudrais comprendre en détail en ce qui concerne le terminal de contrôle, l'entrée et la sortie standard, etc.
Est-ce un moyen raisonnable d'atteindre l'objectif d'exécuter cette commande en tant que processus d'arrière-plan. Sinon pourquoi, non?
Je souhaite diffuser les meilleures pratiques au sein de mon entreprise, mais je dois pouvoir démontrer et sauvegarder toutes les recommandations que je fais.
Je veux aussi comprendre ce qui se passe exactement.
la source
chroot --userspec root:root / sh -c "exec some_forever_process" &
. Le travail s'exécute en tant que même utilisateur, sans explicitenohup
avant oudisown
après. Donc, dans ce cas, comment se fait-il que le signal ne puisse pas être délivré à la sortie du terme?some_forever_process
était destiné à être exécuté indéfiniment (un démon) et se protège ainsi contre la réception de SIGHUP à partir d'une sortie de terminal (en s'exécutant dans son propre groupe de processus).