Назад | Перейти на главную страницу

сервер systemd oneshot для запуска каждые x дней

Я надеялся запускать команду каждые 85 дней, используя systemd. Я создал таймер и службу для команды, но не могу запустить таймер. Я надеюсь, что команда будет запускаться каждые 85, а не при загрузке и запускаться, даже если сервер перезагружается в течение 85-дневного периода.

/etc/systemd/system/my.service

[Unit]
description=Do my task

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/myTask

/etc/systemd/system/my.timer

[Unit]
Description=Timer to do my task

[Timer]
OnUnitActiveSec=85d
Unit=my.service
Persistent=true

После попыток запустить его с помощью systemctl start my.timer, я получаю следующие сообщения об ошибках:

my.timer: Refusing to start, unit to trigger not loaded.
Failed to start Timer to do my task.

Проблема заключалась в том, что сценарий, который я пытался запустить, изначально не работал нормально.

Я диагностировал это по:

  1. глядя на статус времени, упомянутый выше Андрилом
# systemctl status my.timer
● my.timer - Timer to update stuff
   Loaded: loaded (/etc/systemd/system/my.timer; enabled; vendor preset: enabled)
   Active: active (elapsed) since Tue 2020-01-28 07:14:54 UTC; 2 weeks 6 days ago
  Trigger: n/a

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
  1. Глядя на список таймеров (чтобы получить больше статистики)
# systemctl list-timers
NEXT                         LEFT        LAST                         PASSED                UNIT                         ACTIVATES
...
n/a                          n/a         Tue 2018-03-20 14:13:46 UTC  1 years 10 months ago my.timer            my.service
  1. Пытался запустить службу, чтобы активировать службу (так как таймер основан на времени последней активации службы
# systemctl status my.service
● my.service - Renew Lets Encrypt certificates
   Loaded: loaded (/etc/systemd/system/my.service; static; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2020-02-17 15:53:18 UTC; 20s ago
  Process: 19875 ExecStart=/usr/local/sbin/script (code=exited, status=203/EXEC)
 Main PID: 19875 (code=exited, status=203/EXEC)

Feb 17 15:53:18 server systemd[1]: Starting Update stuff...
Feb 17 15:53:18 server systemd[19875]: my.service: Failed to execute command: Exec format error
Feb 17 15:53:18 server systemd[19875]: my.service: Failed at step EXEC spawning /usr/local/sbin/script: Exec format error
Feb 17 15:53:18 server systemd[1]: my.service: Main process exited, code=exited, status=203/EXEC
Feb 17 15:53:18 server systemd[1]: my.service: Failed with result 'exit-code'.
Feb 17 15:53:18 server systemd[1]: Failed to start Update stuff.
  1. Путем проб и ошибок посмотрел скрипт и увидел, что он не работает, поэтому добавил один
# vim /usr/local/sbin/script
#!/bin/bash
echo Update!
  1. Попытался снова запустить службу
# systemctl start my.service
# systemctl status letsencrypt.service
● my.service - Update stuff
   Loaded: loaded (/etc/systemd/system/my.service; static; vendor preset: enabled)
   Active: inactive (dead) since Mon 2020-02-17 16:05:45 UTC; 4s ago
  Process: 31781 ExecStart=/usr/local/sbin/script (code=exited, status=0/SUCCESS)
 Main PID: 31781 (code=exited, status=0/SUCCESS)

Feb 17 16:05:45 server systemd[1]: Starting Update stuff...
Feb 17 16:05:45 server test[31781]: Update!
Feb 17 16:05:45 server systemd[1]: Started Update stuff.

(уууу)

  1. Снова проверил таймеры
# systemctl list-timers
NEXT                         LEFT                  LAST                         PASSED                UNIT                         ACTIVATES
...
Tue 2020-05-12 16:05:45 UTC  2 months 24 days left Tue 2018-03-20 14:13:46 UTC  1 years 10 months ago my.timer            my.service

x timers listed.
Pass --all to see loaded but inactive timers, too.

(теперь таймер показывает, что он снова запустится)

+ Изменить description в вашем служебном файле Description. В противном случае в журналах будут отображаться ошибки, как показано ниже:

Неизвестное lvalue 'description' в разделе 'Unit'

Также попробуйте использовать эти команды для устранения проблем с файлом таймера:

systemctl status my.timer
journalctl -xe

Обновите свой пост, если вы видите какие-либо ошибки в журналах и не знаете, как их исправить.