我是一名开发人员,我必须将一些代码复制到我们的测试服务器上才能运行我的代码。
我正在使用 Ubuntu 18.04.2。
我已经开发了一个inotify-tools 和 rsync 的混合:
rsyncWrap(){
rsync -avzq --delete --exclude-from="$HOME/.rsyncignore" "$source" "$target"
}
rsyncWrap
while inotifywait -r -e modify,create,delete,move "$source"; do
rsyncWrap
done
请注意,我依靠 openssh 来处理底层私钥认证。
但我必须确保每次启动计算机时都启动它(我很容易分心,而且@reboot 似乎在我的 cron 中不起作用...)。
此外,一旦出现错误,该脚本往往表现不佳(我有时发现它处于“失效”状态ps aux
)。
实现这一目标的正确工具是什么?
答案1
实现这一目标的正确工具是什么?
你所做的是正确的。rsync
是用于跨不同机器进行文件同步的最佳工具之一,除非你有一个可以推送和拉取的存储库。
但我必须确保每次启动计算机时都启动它(我很容易分心,而且@reboot 似乎在我的 cron 中不起作用...)。
我建议您systemd
在这里使用,因为您可以配置 systemd 服务在网络启动后和连接后运行。@reboot
可能无法正常工作,因为您还没有网络连接(rsync 依赖于此)。
这是您可以使用的示例 systemd 配置:
[Unit]
Description=Some description
After=network-online.target
[Service]
ExecStart=/path/to/script
Type=oneshot
User=<user to run the script with>
[Install]
WantedBy=multi-user.target
保存该配置/etc/systemd/system/<service_name>.service
并运行以下命令:
systemctl daemon-reload
现在如果您想让该脚本在启动时运行:
systemctl enable <service_name>.service
如果您想手动启动脚本,您可以按照通常的方式执行或systemd
再次使用:
systemctl start <service_name>.service
此外,如果出现错误,该脚本往往会表现不佳(我有时发现它在 ps aux 中处于“失效”状态)。
这可能是由于 rsync 分段错误或退出错误(实际上这种情况经常发生)。
我在这里建议你两件事:
1.为 rsync 命令添加超时,以便它不会挂起。
2.如果 rsync 没有返回退出状态 0,则退出(?)或者至少记录一条消息以便您了解情况。或者添加-e
标志,/bin/bash
以便一旦收到错误它就会退出。
关于如何实现这一点的一个简短示例:
rsyncWrap(){
timeout 30 rsync -avzq --delete --exclude-from="$HOME/.rsyncignore" "$source" "$target"
}
rsyncWrap
rsync_exit_code=$?
if [ ! rsync_exit_code -eq 0 ]; then
echo "rsync exited with exit code ${rsync_exit_code}"
done
while inotifywait -r -e modify,create,delete,move "$source"; do
rsyncWrap
if [ ! rsync_exit_code -eq 0 ]; then
echo "rsync exited with exit code ${rsync_exit_code}"
done
done
timeout 30
将确保以下命令运行不超过 30 秒。
参考:
1. 如何使用 systemd 在启动时运行单个命令
2. systemd.服务 wiki
3. bash -e 标志是什么