Lancer Un Processus Au Démarrage
Il est parfois utile de lancer un processus lorsqu’un serveur ou qu’un ordinateur linux démarre. Sur Mac OS, c’est plutot simple, il suffit de cliquer sur le processus dans le dock. Malheureusement, sous linux, avec une console, c’est tout de suite plus compliqué…
Personalisez l'article
Méthode 1 : Utiliser votre crontab
Avantages de la méthode
- Simple à configurer
- Lance un programme en votre nom
Points à considèrer
- Impossible de voir/intéragir avec la console
- Si votre programme affiche des choses, elles vous seront envoyées par mail local
Comment l’utiliser
Ouvrez votre crontab avec crontab -e
puis ajoutez la ligne suivante :
@reboot §§cmd§§
Méthode 2 : Utiliser la crontab du systeme
Avantages de la méthode
- Simple à configurer
- Lance un programme en tant qu’un autre utilisateur
Points à considèrer
- Impossible de voir/intéragir avec la console
- Nécéssite d’être root pour écrire dans la crontab systeme.
Comment l’utiliser
Ouvrez la crontab avec votre éditeur favori: sudo nano /etc/crontab
puis ajoutez la ligne suivante :
@reboot §§user§§ §§cmd§§
Méthode 3 : Utiliser systemd
Avantages de la méthode
- Extrèmement configurable
- Lance un programme en tant qu’un autre utilisateur
- Permet de simplifier les scripts de lancement en prennant en compte le re-lancement, la vérification de certaines conditions, le changement de répertoire, et bien plus
Points à considèrer
- Impossible de voir/intéragir avec la console
- Nécéssite d’être root pour écrire dans la crontab systeme.
- Plus complexe à configurer
Comment l’utiliser
Creez et ouvrez le fichier service dans votre éditeur favori : sudo nano /etc/systemd/system/§§name§§.service
Ajoutez les lignes suivantes :
# Ceci est un service systemd basique crée à l'aide de
# kb.api-d.com/posts/lancer-un-processus-au-demarrage
# Pour en savoir plus sur les options disponibles
# la documentation est disponible ici :
# https://www.freedesktop.org/software/systemd/man/systemd.unit.html#%5BUnit%5D%20Section%20Options
[Unit]
After=network.target
Description=Lancement au démarrage de §§name§§
# Vérifier qu'un répertoire existe au démarrage
#AssertPathExists=/what/ever
[Service]
# Un service simple
# Forking si la commande/le script invoque un screen, par exemple
Type=simple
# Commande de démarrage
# Doit etre un PATH absolu vers un script.
# Peut commencer par /bin/bash
ExecStart=§§cmd§§
# Commande d'arret, si nécéssaire
#ExecStop=§§cmd§§ stop
# Répertoire de travail du service, si nécéssaire
WorkingDirectory=/home/§§user§§
# Utilisateur et groupe
User=§§user§§
Group=§§user§§
# Redémarrage en cas de plantage
# ou always, on-abort, etc
Restart=on-failure
# Temps avant lequel le service sera tué lors d'une commande stop si celle-ci ne réponds pas
TimeoutStopSec=300
# Valeur de nice du service
#Nice=5
[Install]
WantedBy=multi-user.target
N’oubliez pas de rendre votre script exécutable:
chmod 744 /etc/systemd/system/§§name§§.service
Enfin, préparez et lancez votre service:
systemctl daemon-reload
systemctl enable §§name§§.service
Pour lancer votre service immédiatement, tapez :
systemctl start §§name§§.service
Informations supplémentaires
Pour cela, utilisez la commande suivante:
# Le exec bash permet de garder le screen vivant.
/usr/bin/screen -dmS §§name§§ bash -c '§§cmd§§; exec bash'
Et, si l’on veut une boucle, par exemple dans le cas de la crontab :
/usr/bin/screen -dmS §§name§§ bash -c 'while true; do §§cmd§§; sleep 5; done; exec bash'