使用 incrond 运行 Unison(inotify cron 守护进程)

使用 incrond 运行 Unison(inotify cron 守护进程)

我们想用来unison同步两台服务器。从命令行和 bash 文件中,以下命令可以正常工作:

unison -batch /var/www/html/test ssh://host-2//var/www/html/test

文件正在同步并unison.log正在更新。到目前为止,一切都很好。

与首选项文件结合使用,例如并简单地从命令行.unison/default.prf执行,如所述unison这里,一切工作也很好。

我们还安装了incrondinotify cron 守护进程,并且运行顺利。以下 cron 作业执行得很好:

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE touch /root/test

/root/test每次我对文件进行更改时都会更新/var/www/html/test

到目前为止,一切都很好!但使用 incrontab 唯一不起作用的是:

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/bin/unison

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/local/sbin/unison

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison -batch /var/www/html/test ssh://host-2//var/www/html/test

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/bin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/local/sbin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test'

文件中没有显示任何内容unison.log,更不用说更新远程服务器了。以下内容也不会输出任何内容。

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison &> /root/test.log

/root/test.log甚至还没有被创建。

使用名为“也”的批处理文件进行的另一个测试sync.sh不起作用。

在 incrontab 中:

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /root/sync.sh

并在sync.sh

#!/bin/bash

touch /root/test
/usr/bin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test

再次,/root/test触摸得很好,这意味着每次我更新 中的文件时 inofify 都可以很好地工作/var/www/html/test,但再次没有任何结果unison

/var/log/cron 看起来像这样:

May 21 06:33:44 Host-1 incrond[28339]: (root) CMD (sh /root/sync.sh)

并且unison.log根本没有更新。

结论:

  1. inotify工作正常,检测文件系统中的每个更改并执行任务(任何unison任务除外)。
  2. unison除非由incrond守护进程调用,否则可以在命令行和批处理中正常工作。

我是否忽略了什么?

答案1

为了建立 SSH 连接,客户端需要向服务器进行身份验证。您可能正在使用基于密钥的身份验证,密钥存储在受密码保护的文件中并加载到 SSH 代理中。 SSH客户端知道如何通过环境变量找到代理SSH_AUTH_SOCK。在 cron 或 incron 作业中,环境与交互式会话中的环境不同,它是一个非常小的环境,没有SSH_AUTH_SOCK,因此 SSH 客户端无法连接到远程计算机。

如果无法建立 SSH 连接,Unison 甚至不会开始寻找要同步的文件,并且不会向unison.log.

脚本的标准错误有错误消息,但您没有将它们记录在任何地方。exec 2>&1 >>~/.unison-sync.log; date在脚本的开头添加类似的内容。

要使 SSH 连接正常工作,您需要安排 Unison 作业访问您的代理,或者设置无密码密钥。如果您想通过代理,请参阅无法在 Crontab 中使用 shell 脚本 ssh 到远程计算机;但只有在您登录时它才有效。如果您希望同步始终有效,无密码密钥是唯一的解决方案。由于您以 root 身份运行 Unison 和 SSH,因此私钥需要位于 中/root/.ssh,而不是位于您的帐户中。这同样适用于 中的任何相关选项.ssh/config。在服务器端,您可以授权公钥仅运行带有command=…指令的特定一致命令.ssh/authorized_keys(请参阅创建一个只执行一个命令的 UNIX 帐户举个例子)。由于命令限制,如果有人获得本地 root 帐户的访问权限,他们将只能在 ;unison …上运行该特定命令host-2。我不知道 Unison 是否可以被欺骗以这种方式执行任意代码。

相关内容