Простой системный таймер не срабатывает

Я написал этот скрипт для резервного копирования моих файлов sql как физически (копирование баз данных), так и логически (pg_dumpall).

#!/bin/bash

# Backup-Skript für Postgresql

# Dump aller Datenbanken.
/opt/postgresql/bin/pg_dumpall > /mnt/backup/postgresql/pg_backup.bak

# "Physisches" Kopieren des Datenbankverzeichnises.
/opt/rsync/bin/rsync -avu /mnt/evc/postgresql/var/data /mnt/backup/postgresql/
# Dieser Ordner enthält auch die Konfigurationsdateien.
# Daher müssen diese nicht separat kopiert werden.

Следующий модуль systemd использует этот скрипт.

[Unit]
Description=Sicherung der Datenbanken (Postgresql)
DefaultDependencies=no
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
User=postgresql
Group=postgresql
ExecStart=/opt/postgresql/Scripts/backup.sh

[Install]
WantedBy=multi-user.target

Он не включен.

Затем следующий включенный таймер должен запускать службу каждые 15 минут.

[Unit]
Description=Backup des Postgresql-Servers alle 15 Minuten
Requires=backup-postgresql.service

[Timer]
# Alle 15 Minuten.
OnCalendar=*:0,15,30,45
Persistent=true
Unit=backup-postgresql.service

[Install]
WantedBy=timers.target

Но таймер не срабатывает. После первого попадания в ноль служба будет запущена.

sudo systemd list-timers --all

показывает:

NEXT                         LEFT     LAST                         PASSED       UNIT                         ACTIVATES
Thu 2020-02-06 00:00:00 CET  15h left Wed 2020-02-05 08:25:59 CET  20min ago    shadow.timer                 shadow.service
Thu 2020-02-06 08:40:57 CET  23h left Wed 2020-02-05 08:40:57 CET  5min ago     systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
n/a                          n/a      Wed 2020-02-05 08:45:00 CET  1min 32s ago backup-postgresql.timer      backup-postgresql.service

Дополнительная информация: Я на арке с ядром 5.5.1-arch1-1.


person Markus    schedule 05.02.2020    source источник
comment
Я могу ошибаться (и это будет не в первый и не в последний раз), но разве это не запись OnCalendar каждые 15 секунд (minutely сопоставляется с *-*-* *:*:00)? Разве это не должно быть *:0,15,30,45:0?   -  person paxdiablo    schedule 05.02.2020
comment
@paxdiablo: я думаю, что для срабатывания каждые 15 секунд потребуется дополнительный *: (например, *:*:0,15,30,45). Возможно, попробуйте OnUnitActiveSec=15min и посмотрите, сработает ли это.   -  person l'L'l    schedule 05.02.2020
comment
Хорошая идея, но, к сожалению, ничего не изменилось. Даже после перезагрузки.   -  person Markus    schedule 05.02.2020
comment
вы включили таймер, не так ли?   -  person umläute    schedule 05.02.2020
comment
Я сделал, да. Однако блок обслуживания не включен.   -  person Markus    schedule 05.02.2020
comment
Я думаю, что проблема в RemainAfterExit=yes. Это означает, что служба будет запущена до тех пор, пока не будет остановлена. Таймер не останавливает службу. Он просто запускается каждые 15 минут. Поэтому, поскольку служба уже запущена, она больше не идет. Попробуйте удалить RemainAfterExit=yes   -  person Stewart    schedule 05.02.2020


Ответы (1)


Для вашего служебного файла вам не нужно:

  • DefaultDependencies=no,
  • RemainAfterExit=yes, or
  • [Install] раздел.

Я думаю, что RemainAfterExit является проблемой, потому что он поддерживает запуск службы даже после завершения процесса. Это означает, что когда таймер сообщит службе о повторном запуске, это будет проигнорировано, поскольку служба все еще включена.

Для вашего файла таймера вам не нужно следующее, если ваш таймер имеет то же имя, что и ваша служба:

  • Requires=backup-postgresql.service
  • Unit=backup-postgresql.service

На самом деле, Requires может быть проблемой, поскольку запускает резервное копирование, как только вы запускаете таймер, а также приводит к сбою таймера, если службы не запускаются.

Используйте systemctl daemon-reload после изменения этих файлов, чтобы systemd могла их перечитать. Проверьте systemctl status backup-postgresql, чтобы узнать, не зависла ли служба после проблемы RemainAfterExit, и используйте systemctl stop backup-postgresql для восстановления, если она зависла.


Чтобы дать простой шаблон, я просто создал простой таймер с нуля:

# /etc/systemd/system/timeprint.timer
[Unit]
Description=Print time every minute

[Timer]
OnCalendar=*:0/1

[Install]
WantedBy=timers.target
# /etc/systemd/system/timeprint.service
[Unit]
Description=Print time

[Service]
Type=oneshot
ExecStart=/bin/date

Если вы внесете изменения в эти файлы, вам нужно будет запустить systemctl daemon-reload

Я включил с:

systemctl enable timeprint.timer
systemctl start timeprint.timer

Затем я проверил таймер с помощью:

$ sudo systemctl list-timers timeprint
NEXT                         LEFT     LAST                         PASSED  UNIT            ACTIVATES
Wed 2020-02-05 13:00:00 CET  16s left Wed 2020-02-05 12:59:08 CET  35s ago timeprint.timer timeprint.service

1 timers listed.
$ sudo journalctl -u timeprint
-- Logs begin at Tue 2020-01-28 06:55:16 CET. --
Feb 05 12:58:24 stewbian systemd[1]: timeprint.service: Succeeded.
Feb 05 12:58:24 stewbian systemd[1]: Started Print time.
Feb 05 12:59:08 stewbian systemd[1]: Starting Print time...
Feb 05 12:59:08 stewbian date[185510]: Wed  5 Feb 12:59:08 CET 2020
Feb 05 12:59:08 stewbian systemd[1]: timeprint.service: Succeeded.
Feb 05 12:59:08 stewbian systemd[1]: Started Print time.
Feb 05 13:00:24 stewbian systemd[1]: Starting Print time...
Feb 05 13:00:24 stewbian date[185540]: Wed  5 Feb 13:00:24 CET 2020
Feb 05 13:00:24 stewbian systemd[1]: timeprint.service: Succeeded.
Feb 05 13:00:24 stewbian systemd[1]: Started Print time.
person Stewart    schedule 05.02.2020
comment
Этот ответ противоречит этой документации, в которой говорится, что вы должны включить .timer юнит, а не .service юнит. Что правильно? - person rgov; 19.03.2020
comment
Вы правы, включите .timer, а не .service. Ответ исправлен. Включение службы ничего не даст, потому что нет раздела [Install]. - person Stewart; 20.03.2020