仅通过 systemd 计时器在其中创建文件时,目录 mtime 不会更新,手动运行相同命令时工作正常

仅通过 systemd 计时器在其中创建文件时,目录 mtime 不会更新,手动运行相同命令时工作正常

我有以下服务单位来备份我的项目数据库:

[Unit]
Description=%i mysql backup for `apples` database
After=mysqld.service
Requires=mysqld.service

[Service]
User=root
EnvironmentFile=/home/site/backend/config/prod/env
ExecStart=bash -c "mysqldump apples | gzip > /home/site/backups/apples.%I.sql.gz && cp /home/site/backups/apples.%I.sql.gz /mnt/cloud/backup/db/apples/%I/apples_$(date +%%Y-%%m-%%d_%%H-%%M-%%S).sql.gz && touch /mnt/cloud/backup/db/apples/%I"
Restart=on-failure
StartLimitInterval=60
StartLimitBurst=3
Type=simple

[Install]
WantedBy=multi-user.target

它用于通过计时器每小时、每天、每周和每月运行备份(因此%I在服务中)。

现在,如果我手动运行命令ExecStart(当然,将%%s 和%Is 替换为%and 例如monthly),则包含生成的备份的目录的 mtime 将按预期更新。

如果我用 一次性射击其中一个计时器,也会发生同样的情况 - 工作正常。systemctl start [email protected]

当计划在特定时间调用的实际 systemd 计时器在相应目录中创建备份文件时,该{hourly,daily,weekly,monthly}目录的 mtime 不会更新。您可以看到我什至添加了touch调用以确保更新 mtime,但由于某种原因它没有更新。我在这些目录中有一堆每日备份,具有由计划的计时器调用生成的备份文件的正确 mtime,但包含它们的目录具有旧的 mtime。

我的计时器看起来像这样:

[Unit]
Description=%I mysql backup for database `apples`
Requires=mysqld.service
After=mysqld.service

[Timer]
OnCalendar=*-*-* 04:00:00

[Install]
WantedBy=timers.target

/mnt/cloud通过 WebDAV 安装,如果这很重要的话。

我需要更新这些 mtime 来设置自动备份的监控。

可能是什么问题呢?

答案1

我不知道为什么,但只需将整个ExecStart命令移至脚本文件即可解决问题:

ExecStart=/home/site/scripts/backup.sh %I

相关内容