Как я запускаю и останавливаю systemctl сервис в сценарии удара?

Я пишу сценарий удара для выполнения ежедневно резервное копирование. Этот сценарий будет в конечном счете работать автоматически каждое утро (крон или systemd).

То, что я хотел бы выполнить,

  1. Остановите myservice
  2. Выполните процедуры резервного копирования
  3. Запустите myservice

Сценарий удара, который я создал, выглядит примерно так:

# Stop myservice
systemctl stop myservice.service

# Do all the backing up here...

# Start myservice
systemctl start myservice.service

Проблема, которую я имею, - то, что, когда я запускаю этот скрипт, он требует, чтобы мой пароль во время systemctl остановился/начал вызовы. Если это должно работать автоматически, очевидно, паролю не может требоваться каждого раза. Как я запускаю этот скрипт автоматически, не требуя этого пароля?

Ubuntu 18.04

Спасибо!

5
задан 21 December 2018 в 09:41

2 ответа

У Вас есть несколько возможностей, в зависимости от Ваших потребностей и предпочтений.

Очевидный подход …

… должен был бы запустить целый скрипт как пользователя root путем добавления его к root crontab (использование sudo crontab -e). Этому не будет нужен никакой пароль затем когда systemctl stop/start myservice.service выполняется. Оборотная сторона - то, что Вы, возможно, должны работать, резервные задачи как другой пользователь (сказать noslenkwah) и должны переключиться на того другого пользователя для резервного копирования. Пример:

# 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

Другой подход …

… должен был бы добавить systemctl команды в файл в /etc/sudoers.d каталог так, чтобы определенный пользователь мог выполнить их, не предоставляя пароль.

  1. проблема sudo visudo -f /etc/sudoers.d/noslenkwah (Имя файла, noslenkwah не имеет значения, это - просто персональная моя привычка назвать файлы в честь "основного" пользователя затронутыми настройками в том файле. Это просто должен быть файл ниже каталога /etc/sudoers.d.)

  2. Добавьте следующие строки и сохраните файл.

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

Это позволяет пользователю noslenkwah работать sudo systemctl stop myservice.service и sudo systemctl start myservice.service без пароля. Это определяет так называемый псевдоним команды (набор команд) названный MYSERVICE и затем позволяет

  • пользователь noslenkwah
  • на ALL компьютеры
  • как пользователь root
  • без пароля
  • выполнять команды, определенные MYSERVICE

Замена noslenkwah и myservice с фактическим именем пользователя и сервисным названием. Обратите внимание, что действительно необходимо выйти sudo systemctl start myservice.service чтобы это работало (нет sudo systemctl start myservice (без .service, например).

Не заботьтесь о "на ALL компьютеры" часть. Это релевантно, только если Вы намереваетесь распределить тот же самый sudoers файл к нескольким компьютерам.

Вы затем изменили бы свой резервный сценарий на

# 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

и имейте выполненный как пользователь noslenkwah.

7
ответ дан 23 November 2019 в 08:47

Выполните этот сценарий оболочки как корень.

Например, поместите его в корень crontab: sudo crontab -e

4
ответ дан 23 November 2019 в 08:47

Другие вопросы по тегам:

Похожие вопросы: