Comment puis-je exécuter une commande au démarrage (alternative rc.local) sur Ubuntu 16.10

49

J'établis un quota sur mon serveur Linode exécutant Ubuntu 16.10 et j'obtiens le message d'erreur suivant

Ne peut pas stat () périphérique monté / dev / root: aucun fichier ou répertoire de ce type

Donc, pour résoudre ce problème, j'ai atteint ce fil pour le correctif qui se fait en ajoutant

ln -s /dev/xvda /dev/root
/etc/init.d/quota restart

à la /etc/rc.local. Mais Ubuntu 16.10 n’utilise rc.localplus à la place, utilise systemd . Quelle est l'alternative pour rc.local, Comment puis-je exécuter les commandes ci-dessus au démarrage?

De plus, j'ai activé l'utilisation du service, systemctl enable rc-local.servicemais cela n'a pas fonctionné pour moi. Toute avance serait appréciée.

Saurabh Sharma
la source
di vous l'exécutez en tant que root et avez-vous redémarré votre système?
George Udosen
@ George oui, j'ai fait les deux
Saurabh Sharma
essayez ceci
George Udosen
@ George Cela ne fonctionne pas aussi bien
Saurabh Sharma
Je viens de voir ce bidouillage, voir s'il vole ...
George Udosen

Réponses:

65

Intro

Je pense que vous ne devriez pas créer un nouveau service comme suggéré dans le lien de George. Le rc-local.servicefichier existe déjà dans systemd et le fichier de service suggère que le fichier rc.local, s'il existe et qu'il est exécutable, est automatiquement extraitmulti-user.target . Donc pas besoin de recréer ou de forcer quelque chose qui est juste fait d’une autre manière par le systemd-rc-local-generator.

Une solution

Une solution rapide (je ne sais pas si c'est la manière canonique):

Dans un terminal faire:

printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
sudo reboot

Après cela, le système rc.localsera appelé au démarrage du système. Insérez ce que vous voulez.

Contexte

Si vous le faites dans un terminal:

sudo systemctl edit --full rc-local

Vous pouvez voir que le commentaire principal contient des lignes telles que:

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.

Cela indique que, dans ce système, s’il existe un fichier appelé /etc/rc.localexécutable, il sera extrait automatiquement dans le fichier multi-utilisateurs.target. Il suffit donc de créer le fichier suivant ( sudo touch...) et de le rendre exécutable ( sudo chmod +x ...).

Jan
la source
4
N'utilisez pas #!/bin/bash, utilisez #!/bin/shsauf si vous avez vraiment besoin de bash dans votre script. Tous les autres scripts système utilisent dash, pas bash, pour des raisons de performances.
Spikyjt
"pas besoin de recréer ou de forcer quelque chose qui vient juste d'être fait d'une autre manière par le générateur de systemd-rc-local-" rc-localne permet pas de le commander après une autre unité, n'est-ce pas?
x-yuri
20

J'ai vu cette solution suggérée qui implique l'utilisation de systemd ici :

  1. Créer un service:

    sudo vi /etc/systemd/system/rc-local.service
    
  2. Ajoutez votre code ici:

    [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
    
  3. Créez et assurez-vous qu'il /etc/rc.localest exécutable et ajoutez ce code à l'intérieur:

    sudo chmod +x /etc/rc.local

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    exit 0
    
  4. Activer le service:

    sudo systemctl enable rc-local
    
  5. Démarrer le service et vérifier l'état:

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. Si tout se passe bien, vous pouvez ajouter votre fichier codeau /etc/rc.localfichier, puis le redémarrer.

Remarque: Testé sur Lubuntu 16.10.

La source:

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd

George Udosen
la source
J'ai fait toutes les étapes. J'ai le rc.local avec: touch "hello"avant le exit 0. Le service semble être actif, mais il ne crée aucun fichier dans / etc / dir Fonctionne sur ubuntu 16.04 Arabian 5.31
Danny182
Comme l'a souligné @Jan, il n'est pas nécessaire de créer un tout nouveau service, car systemd prend déjà en charge rc.local.
TommyPeanuts
Merci youuuuuuuuuuuuuuuuuuuu, cela fonctionne
GPrathap
2

Pour ajouter à la réponse de Jan , contrairement au rc.localfichier habituel , rc-local serviceest exécuté non pas après le démarrage de tous les services, mais après la mise en ligne du réseau.

Dans certains cas, vous voudrez peut-être exécuter des commandes rc.localultérieurement. Par exemple, je voulais qu'il soit exécuté après le lxddémarrage.

Dans ce cas, vous pouvez éditer rc-local serviceles dépendances de démarrage en créant un fichier de configuration intégré: /etc/systemd/system/rc-local.service.d/override.conf avec le contenu:

[Unit]
After=network.target lxd.service

Où vous pouvez ajouter un nom d'unité nécessaire (comme j'ai ajouté lxd.service)

Ne pas oublier systemctl daemon-reloadaprès.

utilisateur2586441
la source
Bienvenue sur Ask Ubuntu! Si vous souhaitez améliorer une autre réponse, veuillez suggérer une modification. Si vous souhaitez présenter une alternative partielle, veuillez répéter ou citer les parties identiques (au cas où la réponse d'origine changerait) et mettre en évidence les différences. Dans tous les cas, ne créez pas une nouvelle réponse incomplète ! Je vous remercie.
David Foerster