CentOS7には3つのノードがあり、RHEL7には1つのノードを持つ仮想マシンクラスタがあります。 crontabにはrsyncが有効なディレクトリがあり、/mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/api/
設定は次のとおりです。
$ incrontab -l
/mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/api/ IN_MODIFY,IN_ATTRIB,IN_CREATE,IN_DELETE /mnt/rsync/rsync-for-carbon-depsync.sh
デバッグが有効なrsyncスクリプト
#!/bin/sh -ex
#source folder
portal=/mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/
#Destination folder
gateway=/mnt/<server_IP>/gateway/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default
LOG=/log/rsync/carbon-rsync-logs/"log-local-$(date +%Y%m%d_%H%M%S).log"
echo "entered the script" >> $LOG
#keep a lock to stop parallel runs
(
echo "entered the flock" >> $LOG
flock -e 10
echo "Obtained the lock" >> $LOG
echo " ========== $(date -Iseconds) Lock acquired by local thread <server_IP>< =========== " >> $LOG
rsync --delete -arv $portal $gateway >> $LOG
) 10> /var/rsync/.rsync.lock
echo " ========== $(date -Iseconds) Release Lock acquired by local thread <server_IP> =========== " >> $LOG
以下はログファイルです
entered the script
entered the script
デフォルトでは、すべての変更portal
はに反映されなければなりませんgateway
。portal
ディレクトリに一時ファイルを作成しました。ただし、gateway
ディレクトリには反映されません。これは新しいRHEL 7 VMでのみ機能します。以前のCentOS 7 VMは同じスクリプトでうまく機能します。
答え1
/tmp/errors
2行目に新しいコマンドを追加して、ログファイルでエラー報告を有効にすることをお勧めします。少し拡張して、予想される出力と予期しないエラーを単一のファイルにキャプチャするために、次のように修正しました/tmp/output
。
#!/bin/sh -ex
exec >/tmp/output 2>&1
#source folder
portal=/mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/
...
実稼働環境では、人々はより明確に定義されたログファイルに記録したり、システムロガーを使用したりします(詳細man logger
)。
シェル-e
フラグは、成功しなかった状態(ゼロ以外の終了コード)を返すコマンドを実行した直後に終了するようにします。エラーログは、シェルがシャットダウンしたときにエラーによって生成された出力をキャプチャします。この-x
フラグはトレースを有効にします。ログファイルも追跡できます。
中コメント君が決めて、」/var
RHEL 7にはrsyncディレクトリはありません。」。
したがって、スクリプトがRHEL 7で実行されていないのは、スクリプトに必要なディレクトリが作成されていないためです。スクリプトは書き込みを試みます/var/rsync/.rsync.lock
が、親ディレクトリが存在しないため書き込みできません。
解決策は、ディレクトリを作成し、スクリプトを実行するUIDがディレクトリに書き込むことができることを確認することです。より良い方法は、ディレクトリがまだ存在しない場合はスクリプトを修正してディレクトリを作成するか、取得して実際の人に提供できる方法でこのエラーを報告することです。