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
まったく更新されていません。
結論:
inotify
正常に動作し、ファイル システム内のすべての変更を検出し、任意のunison
タスクを除いてタスクを実行します。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/config
。command=…
.ssh/authorized_keys
1つのコマンドのみを実行するUNIXアカウントを作成するたとえば、コマンド制限により、誰かがローカルのルート アカウントにアクセスした場合、その特定のunison …
コマンドしか実行できなくなりますhost-2
。Unison がそのようにして任意のコードを実行するように仕向けられるかどうかはわかりません。