使用 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 是否可以被欺騙以這種方式執行任意程式碼。

相關內容