Comment puis-je exécuter un script au démarrage sur Ubuntu Server 17.10?


13

Comment puis-je exécuter un script au démarrage sur une machine Ubuntu Server 17.10? Je pense que la méthode a été modifiée en 17.10.

Réponses:


14

Mettez le script dans la crontable de l'utilisateur approprié (c'est-à-dire la crontab ) avec un planning de @reboot.

Un utilisateur peut modifier sa crontable avec crontab -e.

Un exemple qui s'exécutera /path/to/script.shau démarrage:

@reboot /path/to/script.sh

Si vous devez l'exécuter en tant que root, ne l'utilisez pas @reboot sudo /path/to/script.sh;
utiliser sudo crontab -eu rootpour éditer la crontab de root.

Voir aussi: crontab (1), cron (8), crontab (8)


2

Ubuntu 15.04 et versions ultérieures utilisent par défaut quelque chose appelé systemd, qui est un programme (en quelque sorte) qui automatise les services et les procédures de démarrage. Vous pouvez créer le vôtre et l'ajouter à la liste des services de démarrage avec seulement un peu d'effort.

Service Systemd de base

Ceci est un .servicefichier barebones qui pourrait être utilisé pour lancer mon serveur python gui (aurait pu être un script shell, peu importe):

[Unit]
Description=Python GUI Server

[Service]
ExecStart=/home/pi/software/GUI_POE.py &

[Install]
WantedBy=multi-user.target

L' Descriptionoption est n'importe quelle chaîne décrivant ce qu'est ou fait le service.

L' ExecStartoption spécifie la commande à exécuter. Ici, je donne un chemin vers un script python exécutable et j'utilise le &jeton pour l'exécuter en arrière-plan.

L' WantedByoption spécifie la priorité, en fonction de la cible qui souhaite utiliser ce service. Si vous n'avez pas besoin que votre service s'exécute à un moment très précis, définissez-le simplement sur multi-user.target.

Procédure de base

  1. Écrivez le script que vous souhaitez exécuter au démarrage en utilisant nanoou n'importe quel éditeur de votre choix. Assurez-vous d'inclure le shebang approprié tout en haut du fichier ( #!/bin/bashpour les scripts bash), et donnez-lui des autorisations exécutables avec chmod.

  2. Écrivez simplement votre service dans un fichier nommé my_service.service, puis copiez-le dans le bon répertoire avec cp my_service.service /lib/systemd/system/.

  3. Démarrez votre service: sudo systemctl start my_service.service. Cela lance le script que vous avez demandé à votre service d'exécuter. La même commande avec "stop" au lieu de start la désactivera.

  4. Ajouter votre service au processus de démarrage: sudo systemctl enable my_service.service. Pour le supprimer, remplacez simplement "enable" par "disable" dans la même commande.

Et c'est tout! Gardez à l'esprit que votre script sera automatiquement exécuté avec les autorisations root, comme c'est le cas par défaut dans les services systemd.

Mon exemple simple (complet)

Pour référence, voici un simple service systemd que j'ai qui lance un simple serveur GUI Python utilisant Dash:

[Unit]
Description=Python GUI Server
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/home/pi/software
ExecStart=/home/pi/software/GUI_POE.py &
Restart=always
RestartSec=15s
KillMode=process
TimeoutSec=infinity
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

Cet exemple de service utilise un script Python3 mais la formule est exactement la même pour un script shell.

Pour en savoir plus, consultez cet excellent didacticiel de DigitalOcean et ce fil AskUbuntu avec une excellente réponse qui m'a aidé à apprendre systemd. J'espère que cela t'aides!


2
Merci d'avoir apporté une perspective systémique à cette question! Je voudrais souligner qu'il n'y a pas vraiment besoin de forcer l'arrière-plan dans la ligne ExecStart.
Jeff Schaller
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.