Il existe de nombreux cas où de petites différences entre les environnements peuvent vous mordre. C'est celui que j'ai rencontré récemment. Quelle est la différence entre ces deux commandes?
1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &
La réponse est la même que d'habitude - cela dépend.
nohup intercepte le signal de raccrochage, contrairement à l'esperluette.
Quel est le signal de raccrochage?
SIGHUP - raccrochage détecté sur le terminal de contrôle ou arrêt du processus de contrôle (valeur: 1).
Normalement, lors de l'exécution d'une commande en utilisant & et en quittant le shell par la suite, le shell terminera la sous-commande avec le signal de raccrochage (comme kill -SIGHUP $ PID). Cela peut être évité en utilisant nohup, car il capte le signal et l'ignore afin qu'il n'atteigne jamais l'application réelle.
Très bien, mais comme dans ce cas, il y a toujours des «mais». Il n'y a aucune différence entre ces méthodes de lancement lorsque le shell est configuré de manière à ne pas envoyer SIGHUP du tout.
Dans le cas où vous utilisez bash, vous pouvez utiliser la commande spécifiée ci-dessous pour savoir si votre shell envoie SIGHUP à ses processus enfants ou non:
~ $ shopt | grep hupon
Et en plus - il y a des cas où nohup ne fonctionne pas. Par exemple, lorsque le processus que vous démarrez reconnecte le signal NOHUP (cela se fait à l'intérieur, au niveau du code d'application).
Dans le cas décrit, le manque de différences m'a mordu quand à l'intérieur d'un script de lancement de service personnalisé, il y avait un appel à un deuxième script qui configure et lance l'application appropriée sans commande nohup.
Dans un environnement Linux, tout s'est bien passé, dans un second, l'application s'est arrêtée dès que le deuxième script est sorti (détecter ce cas, bien sûr, m'a pris beaucoup plus de temps que vous ne le pensez: stuck_out_tongue :).
Après avoir ajouté nohup comme méthode de lancement au deuxième script, l'application continue de fonctionner même si les scripts se terminent et ce comportement est devenu cohérent sur les deux environnements.