systemd:tar(备份)问题backup.service
systemd: tar (backup) issue backup.service
下面应该制作一个带有日期的 tar 文件,在制作 .tar.gz 文件后,检查是否有超过 30 天的文件,如果是,将其删除。
这是我在 systemd 中执行它时得到的结果。直接输入命令行时它可以完美运行:
正在执行:journalctl -u backup.service
Jun 12 14:42:39 Debian-84-jessie-64-LAMP systemd[1]: Starting Backing up folders (/var/www/)...
Jun 12 14:42:39 Debian-84-jessie-64-LAMP systemd[1]: Started Backing up folders (/var/www/).
Jun 12 14:42:39 Debian-84-jessie-64-LAMP tar[27620]: /bin/tar: Von den Optionen „-Acdtrux“, „--delete“ oder „--test-label“ ist j
Jun 12 14:42:39 Debian-84-jessie-64-LAMP tar[27620]: „/bin/tar --help“ oder „/bin/tar --usage“ gibt weitere Informationen.
Jun 12 14:42:39 Debian-84-jessie-64-LAMP systemd[1]: backup.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Jun 12 14:42:39 Debian-84-jessie-64-LAMP systemd[1]: Unit backup.service entered failed state.
backup.service
[Unit]
Description=Backing up folders (/var/www/)
[Service]
WorkingDirectory=/backup/www/
ExecStart=/bin/tar -czpf "backup_$(date '+%y-%m-%d').tar.gz" /var/www/ && find /backup/www/ -maxdepth 0 -name "backup_*.*" -mtime +30
backup.timer
[Unit]
Description=Make Backup of /var/www/
[Timer]
OnCalendar=weekly
Persistent=true
[Install]
WantedBy=timers.target
您问的是 FAQ Why do things behave differently under systemd? 的变体。
在该常见问题解答的回答中,您会注意到系统的命令行语法更加严格,如 man systemd.service
中的 COMMAND LINES 中所述。
请记住,您可以有多个 ExecStart=
行,因此您无需使用 &&
语法,只需添加一个额外的 ExecStart=
行即可。
你的文字说你的命令会删除超过 30 天的文件,但它不会尝试这样做。在你发布的内容中,find
命令是 运行,但没有删除命令。
这就是我在 backup.service 文件中解决它的方法:
[Unit]
Description=Backing up folders (/var/www/)
[Service]
Type=oneshot
WorkingDirectory=/backup/www/
ExecStart=/bin/tar -zcf "backup_weekly.tar.gz" /var/www
ExecStart=/usr/bin/find /backup/www/ -maxdepth 0 -name "backup_*.tar.gz" -type f -mtime +30 -delete
ExecStart=/bin/sh /backup/www/rename_backup.sh
这是我的 backup.timer 文件:
[Unit]
Description=Make Backup of /var/www/
[Timer]
OnCalendar=weekly
Persistent=true
[Install]
WantedBy=timers.target
最后是备份文件夹中名为 rename_backup.sh 的脚本文件:
mv /backup/www/backup_weekly.tar.gz /backup/www/backup_weekly_$(date +%F).tar.gz
不选择只执行脚本的原因是,我想纯粹从 systemd 运行 执行它,只需复制两个文件,并使其独立于系统。原来 systemd 有它自己的偏好和 bash 命令的问题,使得其中一些无法工作。
在我执行之后,脚本会进行备份,将其命名为 "backup_weekly.tar.gz",还没有日期。但是随后调用脚本,将 "backup_weekly.tar.gz"(systemd.service 始终使用该名称创建)重命名为 "backup_weekly_DATE.tar.gz"。我认为这不是最优雅的方式,但它似乎没问题,因为这是一个非常短的脚本。我认为可以肯定地说,将它复制到另一个系统应该不会有任何坏处,即使它由于某种原因最终失败了。
下面应该制作一个带有日期的 tar 文件,在制作 .tar.gz 文件后,检查是否有超过 30 天的文件,如果是,将其删除。 这是我在 systemd 中执行它时得到的结果。直接输入命令行时它可以完美运行:
正在执行:journalctl -u backup.service
Jun 12 14:42:39 Debian-84-jessie-64-LAMP systemd[1]: Starting Backing up folders (/var/www/)...
Jun 12 14:42:39 Debian-84-jessie-64-LAMP systemd[1]: Started Backing up folders (/var/www/).
Jun 12 14:42:39 Debian-84-jessie-64-LAMP tar[27620]: /bin/tar: Von den Optionen „-Acdtrux“, „--delete“ oder „--test-label“ ist j
Jun 12 14:42:39 Debian-84-jessie-64-LAMP tar[27620]: „/bin/tar --help“ oder „/bin/tar --usage“ gibt weitere Informationen.
Jun 12 14:42:39 Debian-84-jessie-64-LAMP systemd[1]: backup.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Jun 12 14:42:39 Debian-84-jessie-64-LAMP systemd[1]: Unit backup.service entered failed state.
backup.service
[Unit]
Description=Backing up folders (/var/www/)
[Service]
WorkingDirectory=/backup/www/
ExecStart=/bin/tar -czpf "backup_$(date '+%y-%m-%d').tar.gz" /var/www/ && find /backup/www/ -maxdepth 0 -name "backup_*.*" -mtime +30
backup.timer
[Unit]
Description=Make Backup of /var/www/
[Timer]
OnCalendar=weekly
Persistent=true
[Install]
WantedBy=timers.target
您问的是 FAQ Why do things behave differently under systemd? 的变体。
在该常见问题解答的回答中,您会注意到系统的命令行语法更加严格,如 man systemd.service
中的 COMMAND LINES 中所述。
请记住,您可以有多个 ExecStart=
行,因此您无需使用 &&
语法,只需添加一个额外的 ExecStart=
行即可。
你的文字说你的命令会删除超过 30 天的文件,但它不会尝试这样做。在你发布的内容中,find
命令是 运行,但没有删除命令。
这就是我在 backup.service 文件中解决它的方法:
[Unit]
Description=Backing up folders (/var/www/)
[Service]
Type=oneshot
WorkingDirectory=/backup/www/
ExecStart=/bin/tar -zcf "backup_weekly.tar.gz" /var/www
ExecStart=/usr/bin/find /backup/www/ -maxdepth 0 -name "backup_*.tar.gz" -type f -mtime +30 -delete
ExecStart=/bin/sh /backup/www/rename_backup.sh
这是我的 backup.timer 文件:
[Unit]
Description=Make Backup of /var/www/
[Timer]
OnCalendar=weekly
Persistent=true
[Install]
WantedBy=timers.target
最后是备份文件夹中名为 rename_backup.sh 的脚本文件:
mv /backup/www/backup_weekly.tar.gz /backup/www/backup_weekly_$(date +%F).tar.gz
不选择只执行脚本的原因是,我想纯粹从 systemd 运行 执行它,只需复制两个文件,并使其独立于系统。原来 systemd 有它自己的偏好和 bash 命令的问题,使得其中一些无法工作。 在我执行之后,脚本会进行备份,将其命名为 "backup_weekly.tar.gz",还没有日期。但是随后调用脚本,将 "backup_weekly.tar.gz"(systemd.service 始终使用该名称创建)重命名为 "backup_weekly_DATE.tar.gz"。我认为这不是最优雅的方式,但它似乎没问题,因为这是一个非常短的脚本。我认为可以肯定地说,将它复制到另一个系统应该不会有任何坏处,即使它由于某种原因最终失败了。