Простой системный таймер не сработает - PullRequest
0 голосов
/ 05 февраля 2020

Я написал этот сценарий для резервного копирования моих файлов 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

Однако таймер не сработает. После первого попадания в ноль сервис выполняется bud

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 .

1 Ответ

1 голос
/ 05 февраля 2020

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

  • DefaultDependencies=no,
  • RemainAfterExit=yes или
  • [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.
...