我是一名开发人员,我必须将一些代码复制到我们的测试服务器才能运行我的代码。
我正在使用 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
)。
实现该目标的正确工具是什么?
你在做什么是正确的。
rsync
是用于跨不同机器同步文件的最佳工具之一,除非您有一个可以推送和拉取的存储库。我建议您在
systemd
这里使用,因为您可以将 systemd 服务配置为在网络启动后和连接后运行。@reboot
可能无法正常工作,因为您还没有网络连接(rsync 依赖于它)。这是您可以使用的示例 systemd 配置:
您将该配置保存
/etc/systemd/system/<service_name>.service
并运行以下命令:现在,如果您想让该脚本在启动时运行:
如果你想手动启动脚本,你可以按照通常的方式进行或
systemd
再次使用:这可能是因为 rsync 分段错误或错误退出(实际上往往经常发生)。
我会在这里建议你两件事:
1.为rsync命令添加一个超时时间,使其不会挂起。
2.如果 rsync 没有以退出状态 0 返回或至少记录一条消息以便您了解它,则退出 (?)。或者添加
-e
标志,/bin/bash
以便在收到错误后退出。关于如何实现这一目标的简短示例:
timeout 30
将确保以下命令不会运行超过 30 秒。参考资料:
1. 如何使用 systemd 在启动时运行单个命令
2. systemd.Service wiki
3. 什么是 bash -e 标志