web-dev-qa-db-fra.com

Comment démarrer et arrêter un service systemctl dans un script bash?

J'écris un script bash pour effectuer une sauvegarde quotidienne. Ce script s'exécutera automatiquement chaque matin (cron ou systemd).

Ce que j'aimerais accomplir, c'est

  1. Arrêtez mon service
  2. Effectuer des procédures de sauvegarde
  3. Démarrer mon service

Le script bash que j'ai créé ressemble à ceci:

# Stop myservice
systemctl stop myservice.service

# Do all the backing up here...

# Start myservice
systemctl start myservice.service

Le problème que je rencontre est que lorsque je lance ce script, il requiert mon mot de passe lors des appels stop/start de systemctl. Si cela doit fonctionner automatiquement, il ne peut évidemment pas exiger un mot de passe à chaque fois. Comment exécuter ce script automatiquement sans avoir besoin de ce mot de passe?

Ubuntu 18.04

Merci!

4
noslenkwah

Vous avez plusieurs possibilités, selon vos besoins et vos préférences.

Une approche apparente…

… Serait d'exécuter le script entier en tant qu'utilisateur rooten l'ajoutant à rootname __ 's crontab(en utilisant Sudo crontab -e). Il n'aura pas besoin de mot de passe lors de l'exécution de systemctl stop/start myservice.service. L'inconvénient est que vous devrez peut-être exécuter les tâches de sauvegarde en tant qu'un autre utilisateur (par exemple, noslenkwahname__) et devoir basculer vers cet autre utilisateur pour la sauvegarde. Exemple:

# Stop myservice
systemctl stop myservice.service

# Do all the backing up here...
# ... and run the backup_command as user "otheruser":
Sudo -u noslenkwah /path/to/backup_command --with --some --options

# Start myservice
systemctl start myservice.service

Une autre approche…

… Serait d'ajouter les commandes systemctlà un fichier du répertoire /etc/sudoers.d afin qu'un utilisateur spécifique puisse les exécuter sans fournir de mot de passe.

  1. issue Sudo visudo -f /etc/sudoers.d/noslenkwah (Le nom de fichier, noslenkwahn'a pas d'importance, il m'est simplement coutume de nommer les fichiers d'après l'utilisateur "principal" affecté par les paramètres de ce fichier. Il suffit que ce soit un fichier situé sous le répertoire /etc/sudoers.d. )

  2. Ajoutez les lignes suivantes et enregistrez le fichier.

    Cmnd_Alias MYSERVICE = \
        /bin/systemctl stop myservice.service, \
        /bin/systemctl start myservice.service
    
    noslenkwah ALL = (root) NOPASSWD: MYSERVICE
    

Cela permet à l'utilisateur noslenkwahd'exécuter Sudo systemctl stop myservice.service et Sudo systemctl start myservice.service sans mot de passe. Il définit un socalled alias de commande (collection de commandes) nommé MYSERVICEet autorise ensuite

  • l'utilisateur noslenkwahname__
  • sur ALLnoms__
  • en tant qu'utilisateur rootname__
  • sans mot de passe
  • exécuter les commandes définies par MYSERVICEname__

Remplacez noslenkwahet myservicepar le nom d'utilisateur et le nom de service réels. Notez que vous devez vraiment émettre Sudo systemctl start myservice.service pour que cela fonctionne (et non pas Sudo systemctl start myservice (sans .service, par exemple).

Ne vous souciez pas de la partie "sur ALLname__". Cela n’est pertinent que si vous avez l’intention de distribuer le même fichier sudoersà plusieurs ordinateurs.

Vous devez alors changer votre script de sauvegarde pour

# Stop myservice
Sudo systemctl stop myservice.service

# Do all the backing up here...
/path/to/backup_command --with --some --options

# Start myservice
Sudo systemctl start myservice.service

et le faire fonctionner en tant qu'utilisateur noslenkwahname__.

7
PerlDuck

Exécutez ce script de shell en tant que root.

Par exemple, placez-le dans le répertoire racine: Sudo crontab -e

4
EASY