C'est un travail très bien adapté systemd
.
Exécution d'un script en tant que service systemd
Si votre système exécute systemd , vous pouvez configurer votre script pour qu'il s'exécute en tant que service systemd qui permet de contrôler le cycle de vie et l'environnement d'exécution, ainsi que les conditions préalables au démarrage du script, telles que le réseau en cours d'exécution.
Le dossier recommandé pour vos propres services est /etc/systemd/system/
(une autre option est /lib/systemd/system
mais qui devrait normalement être utilisée pour les services OOTB uniquement).
Créez le fichier par exemple avec sudo vim /etc/systemd/system/autossh.service
:
[Unit]
# By default 'simple' is used, see also https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
# Type=simple|forking|oneshot|dbus|notify|idle
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target
[Service]
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=pkill -9 autossh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody
# Useful during debugging; remove it once the service is working
StandardOutput=console
[Install]
WantedBy=multi-user.target
Vous pouvez maintenant tester le service:
sudo systemctl start autossh
Vérification de l'état du service:
systemctl status autossh
Arrêt du service:
sudo systemctl stop autossh
Une fois que vous avez vérifié que le service fonctionne comme prévu, activez-le avec:
sudo systemctl enable autossh
REMARQUE: pour des raisons de sécurité, systemd
le script s'exécutera dans un environnement restreint, similaire à la façon dont les crontab
scripts sont exécutés, donc ne faites aucune hypothèse sur les variables système préexistantes telles que $ PATH. Utilisez les Environment
clés si votre script nécessite la définition de variables spécifiques. L'ajout set -x
en haut de votre script bash puis son exécution systemctl status my_service
peuvent aider à identifier la raison de l'échec de votre script. En règle générale, utilisez toujours des chemins absolus pour tout, y compris echo
ou définissez explicitement votre $ PATH en ajoutant Environment=MYVAR=abc
.