什么是在本地网络上自动传输文件的正确工具?

什么是在本地网络上自动传输文件的正确工具?

我是一名开发人员,我必须将一些代码复制到我们的测试服务器上才能运行我的代码。

我正在使用 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 标志是什么

相关内容