Si vous utilisez une distribution Linux qui utilise Systemd, vous pouvez constater que votre commande dans le fichier /etc/rc.local
ne s’exécute pas au démarrage du système. Ce guide explique comment activer l’exécution du script /etc/rc.local
au démarrage du système.
Activer /etc/rc.local sur Systemd
Si vous tapez la commande suivante dans le terminal :
sudo systemctl status rc-local
Vous pouvez obtenir cette sortie :
● rc-local.service - /etc/rc.local Compatibilité Chargé : chargé (/lib/systemd/system/rc-local.service ; static ; vendor preset : enabled) Actif : échoué (résultat : exit-code) depuis Thu 2015-11-26 23:54:58 CST ; 59s ago Processus : 1001 ExecStart=/etc/rc.local start (code=exited, status=1/FAILURE)Nov 26 23:54:57 vivid rc.local[1001] : File \"/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py\", line 920, in requireNov 26 23:54:57 vivid rc.local[1001] : needed = self.resolve(parse_requirements(requirements))Nov 26 23:54:57 vivid rc.local[1001] : File \"/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py\", line 807, in resolveNov 26 23:54:57 vivid rc.local[1001] : raise DistributionNotFound(req)Nov 26 23:54:57 vivid rc.local[1001] : pkg_resources.DistributionNotFound : shadowsocks==2.8.2Nov 26 23:54:58 vivid sudo[1008] : pam_unix(sudo:session) : session fermée pour l'utilisateur rootNov 26 23:54:58 vivid systemd[1] : rc-local.service : control process exited, code=exited status=1Nov 26 23:54:58 vivid systemd[1] : Échec du démarrage de /etc/rc.local Compatibility.Nov 26 23:54:58 vivid systemd[1] : Unit rc-local.service entered failed state.Nov 26 23:54:58 vivid systemd[1] : rc-local.service failed.
Et si vous essayez d’activer l’exécution de /etc/rc.local au démarrage du système avec la commande :
sudo systemctl enable rc-local
Vous pouvez obtenir :
Les fichiers unitaires n'ont pas de section [Install]. Ils ne sont pas destinés à être activés à l'aide de systemctl. Les raisons possibles pour avoir ce type d'unités sont : 1) Une unité peut être activée statiquement par un lien symbolique à partir du répertoire .wants/ ou .requires/ d'une autre unité. 2) Le but d'une unité peut être d'agir comme une aide pour une autre unité qui a une dépendance d'exigence sur elle. 3) Une unité peut être démarrée en cas de besoin via une activation (socket, path, timer, D-Bus, udev, appel systemctl scripté, ...).
La solution
Comme vous pouvez le voir ci-dessus, le fichier de l’unité n’a pas de section [Install]
. Systemd ne peut donc pas l’activer. Nous devons d’abord créer un fichier :
sudo nano /etc/systemd/system/rc-local.service
Puis ajoutez-y le contenu suivant.
[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target
Enregistrez et fermez le fichier. Pour enregistrer un fichier dans l’éditeur de texte Nano, appuyez sur Ctrl O
, puis sur Enter pour confirmer. Pour quitter le fichier, appuyez sur Ctrl X
. Ensuite, exécutez la commande suivante pour vous assurer que le fichier /etc/rc.local
est exécutable.
sudo chmod x /etc/rc.local
Remarque : À partir de la version 16.10, Ubuntu ne fournit plus le fichier /etc/rc.local
. Vous pouvez créer le fichier en exécutant cette commande.
printf \'%s\\n\' \'#!/bin/bash\' \'exit 0\' | sudo tee -a /etc/rc.local
Puis ajoutez la permission d’exécution au fichier /etc/rc.local
.
sudo chmod x /etc/rc.local
Après cela, activez le service au démarrage du système :
sudo systemctl enable rc-local
Sortie :
Création d'un lien symbolique de /etc/systemd/system/multi-user.target.wants/rc-local.service vers /etc/systemd/system/rc-local.service.
Maintenant, démarrez le service et vérifiez son état :
sudo systemctl start rc-local.servicesudo systemctl status rc-local.service
Sortie :
● rc-local.service - /etc/rc.local Compatibilité Loaded : chargé (/etc/systemd/system/rc-local.service ; enabled ; vendor preset : enabled) Active : actif (en cours d'exécution) depuis Fri 2015-11-27 00:32:56 CST ; 14min ago Processus : 879 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS) Main PID : 880 (watch) CGroup : /system.slice/rc-local.service
Cron @reboot
Si la méthode ci-dessus ne fonctionne pas pour vous, ou si vous souhaitez simplement que quelques commandes simples soient exécutées au démarrage du système, vous pouvez également utiliser la fonctionnalité @reboot de cron pour exécuter automatiquement une commande au démarrage du système. Par exemple, je veux que mon client shadowsocks démarre automatiquement, donc j’ouvre le fichier cron de l’utilisateur root’s :
sudo crontab -e
Et mettez la ligne suivante à la fin de celui-ci.
@reboot /usr/bin/sslocal -c /etc/shadowsocks.json -d start
Sauvegardez et fermez le fichier.
Dans certaines distributions Linux comme archlinux, le démon cron n’est pas activé par défaut. Vous devez donc l’activer manuellement. Pour l’activer sous archlinux, entrez la commande suivante dans le terminal.
sudo systemctl enable cronie
Shadowsocks est un proxy socks5 qui peut être utilisé pour contourner les pare-feu Internet. Si vous êtes intéressé, cliquez sur le lien ci-dessous pour apprendre à configurer votre propre serveur shadowsocks.
- Configurer votre propre serveur shadows sur Debian, Ubuntu et Centos
Comment utiliser Systemd
Vous voulez en savoir plus sur systemd pour gérer efficacement votre système ? Veuillez lire le tutoriel suivant.
- Comment utiliser Systemd pour gérer les services, les niveaux d’exécution et les journaux sous Linux