내 프로젝트 데이터베이스를 백업할 수 있는 서비스 단위는 다음과 같습니다.
[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 및 %I
s를 %
및 예를 들어 로 대체 monthly
) 생성된 백업이 포함된 디렉터리의 mtime이 예상대로 업데이트됩니다.
한 번에 타이머 중 하나를 실행해도 같은 일이 발생합니다. 잘 작동합니다.systemctl start [email protected]
하지만
특정 시간에 호출되도록 예약된 실제 systemd 타이머가 해당 디렉터리에 백업 파일을 생성할 때 {hourly,daily,weekly,monthly}
해당 디렉터리에 대한 mtime은 업데이트되지 않습니다. mtime이 업데이트되었는지 확인하기 위해 호출을 추가했지만 touch
어떤 이유로 업데이트되지 않는 것을 볼 수 있습니다. 이 디렉터리에는 예약된 타이머 호출에 의해 생성된 백업 파일에 대한 올바른 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