Как я правильно устанавливаю systemd таймер и сервис?

Я пытаюсь создать и установить на Бионическом пользовательскую пару systemd таймера и сервисных единиц для выполнения команды периодически. Я знаю, что файлы должны быть помещены в /etc/systemd/system и затем я должен работать systemctl daemon-reload, но я не ясен на том, должен ли я разрешить или запустить что-нибудь для таймера, который будет полностью установлен и "выполнение" и несколько статей, я могу найти, что обращаются к этой точке, которую все дают различной информации.

Мой .timer файл:

[Unit]
Description=Run custom command periodically

[Timer]
Unit=my-custom-command.service
OnCalendar=*-*-* 0/8:00:00

[Install]
WantedBy=timers.target

Мой .service файл:

[Unit]
Description=Run a custom command
OnFailure=mail-systemd-failure@%n.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/custom-command
User=dedicated-user
Group=dedicated-user

Конфликтующие статьи, которые я прочитал:

  • В этой статье говорится для выполнения:

    systemctl daemon-reload
    systemctl enable $NAME.timer
    systemctl start $NAME
    

    Насколько я понимаю последняя команда совпадает с systemctl start $NAME.service, который я ожидал бы сразу выполнять команду, определенную сервисом, который не является тем, что я хочу сделать.

  • Эта суть говорит, чтобы просто работать:

    systemctl daemon-reload
    systemctl start $NAME.timer
    
  • В этой статье говорится для выполнения:

    systemctl enable $NAME.timer
    systemctl start $NAME.timer
    

Я включаю и/или запускаю таймер (или его сервис?), и каково точно различие между двумя? Команды я должен выполнить изменение в зависимости от того, установлены ли файлы единицы недавно или перезагружаемый после редактирования?

6
задан 13 October 2018 в 13:38

1 ответ

Для выполнения единицы в требуемое время или интервалы, Вам нужны две единицы:

  • сервисная единица, которая определяет, что работать
  • единица таймера, которая определяет, когда выполнить сервисную единицу

Условно, единица таймера запускает другую единицу с того же имени, т.е. foo.timer запускается foo.service. Можно переопределить это путем определения Unit=other.service атрибут в единице таймера (как Вы сделал).

Если и файлы единицы создаются и вставляются /etc/systemd/system необходимо сделать systemd зная о них путем издания

systemctl daemon-reload

Это делает systemd перезагрузите все файлы единицы и пересмотрите их зависимости потому что systemd кэширует эти файлы так или иначе. Таким образом каждый раз, когда Вы изменяете файл единицы, эта команда требуется.

После этого необходимо включить единицу таймера:

systemctl enable foo.timer

Это управляет, просто включает автоматический запуск во время начальной загрузки (но еще не запускает единицу). Не включайте сервисную единицу, потому что это означало бы запускать сервис во время начальной загрузки (независимый от любых настроек таймера).

Теперь в следующий раз, когда Вы загружаетесь, таймер будет занят. Для запуска его сразу (не загружаясь), Вы работали бы

systemctl start foo.timer

С этого времени единица таймера запустит сервисную единицу каждый раз, когда время настает. Можно объединить включение и запуск с

systemctl enable --now foo.timer

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

Видеть текущий статус и таймера и сервиса, проблемы

systemctl status foo.timer foo.service

Подводить итог

  • systemctl enable/disable управляет поведением при начальной загрузке
  • systemctl start/stop управляет поведением прямо сейчас
  • enable не подразумевает start (ни один не делает disable подразумевать stop). Это может быть переопределено с --now переключатель.
  • только enable и start единица таймера, не сервисная единица
  • проблема systemctl daemon-reload каждый раз, когда Вы редактируете файлы единицы

Дальнейшее чтение:

9
ответ дан 23 November 2019 в 07:33

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

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