J'écris un script Shell que je voudrais exécuter en tant que démon au démarrage sans utiliser d'outils externes comme daemontools ou démoniser.
Selon le Linux Daemon Writing HOWTO , un démon bon a les caractéristiques suivantes:
stdin
, stdout
, stderr
)/
)daemonize Introduction va plus loin, déclarant qu'un démon typique aussi:
SIGCLD
Comment pourrais-je faire tout cela dans un script sh
, dash
ou bash
avec des outils Linux courants uniquement?
Le script devrait pouvoir fonctionner sur autant de distributions que possible sans logiciel supplémentaire, bien que Debian soit notre objectif principal.
REMARQUE: Je sais qu'il existe de nombreuses réponses sur le réseau StackExchange recommandant l'utilisation de Nohup
ou setsid
, mais aucune de ces méthodes ne répond à toutes les exigences ci-dessus.
EDIT: La page de manuel daemon (7) donne également quelques pointeurs, bien qu'il semble y avoir quelques différences entre les anciens SysV
démons et plus récents systemd
ceux. Étant donné que la compatibilité avec une variété de distributions est importante, veuillez vous assurer que la réponse indique clairement toute différence.
En utilisant systemd , vous devriez pouvoir exécuter un script en tant que démon en créant une unité simple. Il y a beaucoup de différentes options que vous pouvez ajouter, mais c'est aussi simple que possible.
Disons que vous avez un script /usr/bin/mydaemon
.
#!/bin/sh
while true; do
date;
sleep 60;
done
Vous créez une unité /etc/systemd/system/mydaemon.service
.
[Unit]
Description=My daemon
[Service]
ExecStart=/usr/bin/mydaemon
Restart=on-failure
[Install]
WantedBy=multi-user.target
Pour démarrer le démon que vous exécutez
systemctl start mydaemon.service
Pour démarrer au démarrage, vous l'activez
systemctl enable mydaemon.service
Si sur un système basé sur systemd, ce que la majorité des distributions Linux sont aujourd'hui, ce n'est pas vraiment un outil externe. Le négatif serait que cela ne fonctionnera pas partout cependant.
Il me manque probablement quelque chose ici; pourquoi exactement Nohup
ne serait-il pas approprié? Bien sûr, cela ne suffit pas seul, mais le compléter semble simple.
#!/bin/bash
if [ "$1" = "DAEMON" ]; then
# is this necessary? Add other signals at will (TTIN TTOU INT STOP TSTP)
trap '' INT
cd /tmp
shift
### daemonized section ######
for i in $( seq 1 10 ); do
date
sleep 5
done
#### end of daemonized section ####
exit 0
fi
export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
umask 022
# You can add Nice and ionice before Nohup but they might not be installed
Nohup setsid $0 DAEMON $* 2>/var/log/mydaemon.err >/var/log/mydaemon.log &
D'aussi loin que je puisse voir:
stdin
meurt cependant à la fin du script parentinit
(ou systemd
)J'ai le sentiment fort que je manque l'évidence. Downvote, mais dites-moi ce que c'est :-)
La commande Linux screen
contenue dans la plupart des distributions peut démonifier un script Shell. Je l'utilise souvent. Voici un exemple rapide pour démarrer, répertorier et quitter une session d'écran détachée ...
# screen -dmS Session_Name bash -c "while true; do date; sleep 60; done"
# screen -ls
There are screens on:
8534.Session_Name (04/04/2018 08:46:27 PM) (Detached)
# screen -S Session_Name -X quit