58 votes

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

Je suis en train de configurer un quota sur mon serveur Linode fonctionnant sous Ubuntu 16.10, et j'obtiens l'erreur suivante

Impossible de stat() sur le périphérique /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 est fait en ajoutant

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

au /etc/rc.local . Mais Ubuntu 16.10 n'utilise pas rc.local utilise plutôt systemd . Quelle est l'alternative pour rc.local Comment puis-je exécuter les commandes ci-dessus au démarrage ?

J'ai également activé le service en utilisant systemctl enable rc-local.service mais ça n'a pas marché pour moi. Toute piste serait appréciée.

76voto

Jan Points 1073

Intro

Je pense que vous ne devriez pas créer un nouveau service comme le suggère le lien de George. Le site rc-local.service existe déjà dans systemd et le fichier de service suggère que l'option rc.local s'il existe et s'il est exécutable, est tiré automatiquement dans multi-user.target . Il n'est donc pas nécessaire de recréer ou de forcer quelque chose qui est déjà fait d'une autre manière par le système de gestion de l'information. 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 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 de tête 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 y a un fichier appelé /etc/rc.local qui est exécutable, alors il sera tiré dans multi-user.target automatiquement. Donc vous créez juste le fichier correspondant ( sudo touch... ) et le rendre exécutable ( sudo chmod +x ... ).

24voto

George Udosen Points 33267

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

  1. Créez un service :

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

    [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éer et s'assurer /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. Activez le service :

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

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
  6. Si tout va bien, vous pouvez ajouter votre code au /etc/rc.local puis redémarrez-le.

Nota: Testé sur Lubuntu 16.10.

Quelle:

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

6voto

user2586441 Points 61

À ajouter à La réponse de Jan que, contrairement à l'habituel rc.local fichier, 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 vouloir exécuter des commandes à partir de rc.local plus tard. Par exemple, je voulais qu'il soit exécuté après lxd commencer.

Dans ce cas, vous pouvez modifier rc-local service les dépendances de démarrage en créant un fichier de configuration : /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 ça.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X