我希望我的云存储同步在系统关闭期间执行。为此,我使用 rclone 和 MEGA 云存储。因此,感谢指南作者,我得到了以下内容:
运行关机服务:
[Unit]
Description=Syncing with MEGA cloud storage
DefaultDependencies=no
Before=shutdown.target halt.target
RequiresMountsFor=/home/yevhenii
After=network-online.target
[Service]
Type=oneshot
User=yevhenii
ExecStart=/home/yevhenii/Projects/ubuntu-scripts/mega_sync_pc.sh
[Install]
WantedBy=halt.target shutdown.target
它运行的简单脚本:
REBOOT=$( systemctl list-jobs | egrep -q 'reboot.target.*start' && echo "rebooting" || echo "not_rebooting" )
if [ $REBOOT = "not_rebooting" ]; then
echo "Syncronizing Projects" >> /home/yevhenii/log.txt
#rclone check /home/yevhenii/Projects mega:Projects >> /home/yevhenii/log.txt
rclone sync /home/yevhenii/Projects mega:Projects >> /home/yevhenii/log.txt
echo "" >> /home/yevhenii/log.txt
REPORT=$(systemctl status run_on_shutdown)
echo $REPORT >> /home/yevhenii/log.txt
fi
结果:它不起作用。此脚本在关机时运行,但我没有收到来自 rclone 的任何消息。它仅在日志文件中打印“同步项目”。同步和检查均不起作用。这有什么问题?在命令行中执行“rclone check”会导致非常快速的响应(1-2 秒),而关机时间延长至 10 秒甚至更长。
答案1
我认为您需要在该部分中放置ExecStop=
一行和多行适当的线条。After=
[Service]
无论如何,我有一个类似的脚本。它不执行rsync
;但它在系统启动期间以及系统停止期间执行其他与网络相关的操作。
我正在使用以下服务定义(文件/lib/systemd/system/zzz-my-sss.service
:)
[Unit]
Description=Execute system START and STOP script
After=network.target syslog.target
After=systemd-user-sessions.service
After=network-online.target
[Service]
User=_my_user_
Type=oneshot
ExecStart=/home/_my_user_/path/to/my/script.sh START
RemainAfterExit=true
ExecStop=/home/_my_user_/path/to/my/script.sh STOP
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target
这_my_user_
是我的普通 Ubuntu 用户。该脚本/home/_my_user_/path/to/my/script.sh
将在系统启动期间(网络启动后)使用参数 调用START
。同样,它将在系统关闭期间(网络关闭前)使用参数 调用STOP
。
您应该使用以下方式启用此服务:
# systemctl enable zzz-my-sss.service
您可以使用以下方式手动启动/停止它:
# systemctl start zzz-my-sss.service
# systemctl status zzz-my-sss.service
# systemctl list-units | grep zzz-my-sss.service
# systemctl stop zzz-my-sss.service
并使用以下命令禁用它:
# systemctl disable zzz-my-sss.service
如果您更新它,请不要忘记运行:
# systemctl daemon-reload
答案2
经过多次尝试,我终于找到了解决方案。我找不到如何让 auto-sync.sh 仅在关机时运行的方法。所以,我找到了用 bash 检查它的方法。
服务文件
[Unit]
Description=Syncing with MEGA cloud storage v100
After=network-online.target
[Service]
User=yevhenii
Type=oneshot
ExecStart=/bin/true
ExecStop=/path_to_your_script/auto-sync.sh
RemainAfterExit=true
TimeoutStopSec=0
StandardOutput=tty
StandardError=inherit
[Install]
WantedBy=multi-user.target
脚本文件
REBOT_FACTOR=$( systemctl list-jobs | egrep -q 'reboot.target.*start' && echo "rebooting" || echo "not_rebooting" )
if [[ "$REBOT_FACTOR" == "not_rebooting" ]]; then
# You can perform your rclone sync right here.
# Code here will be started only at shutdown.
fi