incrond (inotify cron デーモン) で Unison を実行する

incrond (inotify cron デーモン) で Unison を実行する

2 つのサーバーを同期するために使用したいと思いますunison。コマンド ラインと bash ファイルでは、次のコマンドが正常に機能します。

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

ファイルは同期され、unison.log更新されています。これまでのところ順調です。

設定ファイルと組み合わせて、以下のようにコマンドラインから.unison/default.prf実行するだけです。unisonここ、物事もうまくいきます。

inotify cron デーモンもインストールされておりincrond、スムーズに実行されています。次の 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 のシェル スクリプトを使用してリモート マシンに SSH 接続できない; ただし、ログインしている間だけ動作します。同期を常に動作させたい場合、パスワードなしのキーが唯一の解決策です。Unison を実行して SSH を root として実行しているため、秘密鍵は/root/.sshアカウントではなく にある必要があります。 の関連オプションについても同様です。サーバー側では、 のディレクティブを使用して、公開鍵が特定の unison コマンドを実行することのみを許可できます( を参照) .ssh/configcommand=….ssh/authorized_keys1つのコマンドのみを実行するUNIXアカウントを作成するたとえば、コマンド制限により、誰かがローカルのルート アカウントにアクセスした場合、その特定のunison …コマンドしか実行できなくなりますhost-2。Unison がそのようにして任意のコードを実行するように仕向けられるかどうかはわかりません。

関連情報