web-dev-qa-db-fra.com

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

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 effectué en ajoutant

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

au /etc/rc.local. Mais Ubuntu 16.10 n’utilise plus rc.local mais plutôt 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é le service en utilisant systemctl enable rc-local.service mais cela n'a pas fonctionné pour moi. Toute avance serait appréciée.

39
Saurabh Sharma

Intro

Je pense que vous ne devriez pas créer un nouveau service comme suggéré dans le lien de George. Le rc-local.service existe déjà dans systemd et le fichier de service suggère que le rc.local, s'il existe et qu'il soit exécutable, est extrait automatiquement dans multi-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

Ensuite, le rc.local sera 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.local qui est exécutable, il sera automatiquement extrait dans le fichier multi-utilisateurs.target. Il suffit donc de créer le fichier correspondant (Sudo touch...) et de le rendre exécutable (Sudo chmod +x ...).

58
Jan

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

  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 que /etc/rc.local est 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 code au fichier /etc/rc.local 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

19
George Udosen

Pour ajouter à réponse de Jan , contrairement au fichier rc.local habituel, rc-local service est 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 pouvez exécuter des commandes à partir de rc.local ultérieurement. Par exemple, je voulais qu'il soit exécuté après le début du lxd.

Dans ce cas, vous pouvez éditer les dépendances de démarrage rc-local service en créant un fichier de configuration à insérer: /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)

N'oubliez pas de systemctl daemon-reload après cela.

2
user2586441