Comment puis-je exécuter “rc.local” au démarrage?

75

J'ai un script que j'aimerais exécuter lorsque mon système démarre. Je l'ai mis sur "rc.local", mais cela ne fonctionne pas. Comment puis-je l'activer au démarrage?

pedroo
la source
1
Où se trouve la commande xsetwacom? /etc/rc.local est exécuté avec un PATH très simple au démarrage. Cela diffère probablement du PATH que vous avez connecté au terminal. Dans le terminal, tapez: type -p xsetwacom puis remplacez la commande "xsetwacom" dans /etc/rc.local par le chemin complet, tel qu'il est renvoyé par le "type -p". Devez-vous effectuer des initialisations manuelles avant que xsetwacom ne fonctionne pour vous?
Waltinator
3
En utilisant systemd comme gestionnaire de démarrage, assurez-vous que la compatibilité rc.local fonctionne:systemctl status rc-local.service
rubo77 le
Le commentaire de Waltinator était mon problème. En raison du chemin minimal, il ne savait pas comment exécuter les scripts que je voulais exécuter. Le chemin chargé sur mon système Ubuntu 14.04 au moment de l'exécution de /etc/rc.local était le suivant: / sbin: / usr / sbin: / bin: / usr / bin ... vous pouvez vérifier le vôtre en mettant echo $PATH > /home/rc_local_pathdans votre / etc / rc.local, puis vérifiez le fichier après son exécution au démarrage.
RaisinBranCrunch
Gardez à l'esprit que si votre script doit être exécuté en permanence, vous devez le démarrer en tant que démon dans le rc.localfichier!
totymedli
Utilisez-le sudo systemctl enable rc-local.servicepour vous assurer qu'il /etc/rc.local est exécuté lors du démarrage du serveur
William

Réponses:

56

Pouvez-vous exécuter votre script manuellement? Sinon, c'est un problème avec ce script; sinon regardez plutôt rc.local. (Si ce script doit être exécuté en tant que root, vous devez utiliser sudo pour l'exécuter manuellement.)

Assurez-vous que /etc/rc.local est exécutable et que le script qu’il appelle est également exécutable.

$ ls -l /etc/rc.local
-rwxr-xr-x 1 root root 419 2010-08-27 11:26 /etc/rc.local

Assurez-vous que rc.local a une ligne shebang (qui est la valeur par défaut):

$ head -n1 /etc/rc.local
#!/bin/sh -e

la source
Oui, je peux exécuter le script manuellement. Comment puis-je m'assurer que /etc/rc.local est exécutable? Qu'est-ce que je dois taper? Est-ce "$ ls -l /etc/rc.local -rwxr-xr-x 1"? Merci!
pedroo
@ pedroo: J'ai copié exactement ce que je vois dans mon terminal (vous voyez donc l'invite, l'entrée et la sortie ci-dessus). La commande est "ls -l /etc/rc.local" et si elle est exécutable, elle aura ces X dans la sortie.
3
J'ai essayé le "ls -l /etc/rc.local" et il est exécutable, mais je ne peux pas le faire fonctionner au démarrage ... Une idée?
pedroo
1
@pedroo: Le serveur X doit être en cours d'exécution, ce qui ne se produit pas lorsque rc.local est exécuté. Le lancer à partir de rc.local le fera simplement quitter sans rien faire (bien que j'espère qu'il mette un message dans syslog ou ailleurs). Vous devez plutôt placer les commandes xsetwacom dans ~ / .xinitrc ou / etc / X / xinit / xinitrc.
1
@pedroo: Parce que rc.local contient des commandes destinées à être exécutées à une heure différente. Créez un nouveau fichier, vous pouvez le mettre dans ~ / bin , le marquer comme exécutable (chmod ou propriétés dans Nautilus), créer la première ligne "#! / Bin / bash", puis placer vos commandes sur des lignes ultérieures.
53

Dans mon cas, aucune des instructions n’était une solution parfaite. Si vous étiez aussi malchanceux que moi, essayez celui-ci détaillé

  1. Placez tout votre code d'exécution dans un fichier texte séparé portant un nom quelconque, tel que foo.sh, et enregistrez-le à un endroit quelconque.
  2. Ajouter

    #!/bin/sh

    comme première ligne de votre code.

  3. Essayez d’exécuter votre foo.sh en

    sudo foo.sh

    pour vérifier il n'y a pas d'erreur du tout.

  4. Indiquez à votre script /etc/rc.local le chemin complet et le nom de votre script créé après la commande sh

    sh '/path/to/your/script/foo.sh'
  5. N'oubliez pas de mettre la ligne ci-dessus avant la dernière ligne de code

    exit 0

    à la fin du script /etc/rc.local.

  6. Vérifiez la première ligne de /etc/rc.local pour être

    #!/bin/sh -e
  7. Rendez votre /etc/rc.local exécutable au cas où il ne serait pas déjà exécutable par

    sudo chown root /etc/rc.local
    sudo chmod 755 /etc/rc.local
  8. Vérifiez que tout fonctionne bien en exécutant

    sudo /etc/init.d/rc.local start
  9. Testez le redémarrage de votre système.
Shvahabi
la source
6
L'étape 8 était la clé, vérifiant que le script s'exécutera dans l'environnement de démarrage. Dans mon cas, je dois donner le chemin complet à la commande.
Peter Gluck
Préfet et pas à pas, il fonctionne sur des centos, mais d’ sudo /etc/rc.local startabord.
A1Gard
Merci - cette décomposition m'a vraiment aidé et, comme ci-dessus, l'étape 8 a été la clé pour moi aussi! Sans cela, il ne faudrait pas rediriger +1 (pour référence, l'application de nœud s'exécutant sur le serveur cloud bitnami utilise toujours pour une exécution continue).
Fidev
L'étape 8 était un bon conseil, mais je pense que l'étape 7 pourrait être la solution, j'essayais d'exécuter le script en utilisant cron pour ouvrir un tunnel, mais cela échouait de manière aléatoire.
SeanClt
28

Sur les nouvelles versions d'Ubuntu systemdest utilisé et /etc/rc.localn'est pas toujours chargé par défaut.

Vérifiez si le service de compatibilité est chargé avec

systemctl status rc-local.service

capture d'écran

S'il contient actif (quitté), votre réglage semble correct et vous risquez de rencontrer une autre erreur dans votre /etc/rc.localfichier (il peut s'agir d'une commande qui échoue, par exemple).

rubo77
la source
4
si rc-local.service n'est pas activé, cochez cette publication expliquant comment activer /etc/rc.local avec Systemd
yaitloutou
3

2 suggestions.

  1. Assurez-vous que le fichier de script cible est également marqué comme exécutable.
  2. Le script cible exécute-t-il une commande sudo ? Si c'est le cas, vous voudrez peut-être lui fournir le mot de passe sudo.

Ma faute. Il suffit de vérifier un alors. Merci pour la correction enzotib :)

Ankit
la source
8
rc.localest exécuté en tant que root, aucun mot de passe n'est nécessaire.
enzotib