bashスクリプトのtailコマンドが、2つのパラメータのうち1つのパラメータのみを指定してリモートから呼び出されたときに正しく機能しないという問題があります。しかし、以下の場合は正しく機能します。
- 1パラメータでローカルで直接実行
- 2パラメータでローカルで直接実行
- 2パラメータでリモートから実行
followで末尾から始まるスクリプトを以下に書きました。それは2つのパラメータを取ります。
- TESTNAME:このパラメータは必須です。これはテストケースの名前です。この名前のログファイルを作成します。
SLAVE_HOST:このパラメータはオプションです。提供されている場合、提供されているスレーブホストにSSHで接続し、同様のスクリプトを起動します。
#!/bin/bash TESTNAME="$1" testdate=$(date +'%m_%d_%Y') REG_DIR=/opt/reg-test-results/REG_"$testdate" #create regression results directory if it does not exist mkdir -p "$REG_DIR" FILENAME="$REG_DIR"/"$TESTNAME" #if file already exists, create a new one with current time stamp appended to name if [ -f "$FILENAME" ]; then TIME=$(date +'%m_%d_%Y-%H.%M.%S') FILENAME="$FILENAME"_"$TIME" fi echo "$FILENAME" > /opt/reg-test-results/currentTestName #start tailing nohup tail -f -n0 /path/to/log/files/*/*server.log > "$FILENAME" & echo "$!" > $REG_DIR/reg_tail.pid #if slave host is provided, start tailing logs on slave also if [ "$#" -gt 1 ]; then SLAVE_HOST="$2" ssh "$SLAVE_HOST" /path/to/script/startTailLogTestCaseSlave.sh "$FILENAME" fi
コードの最初の数行は、パラメーターを変数に保存し、末尾のログが送られるログファイルのディレクトリ構造とファイル名を作成します。 その後、ログの最後尾とログファイルへの転送を開始するnohup tailコマンドがあります。これは正しく機能していないコード行です。それから2番目の引数が与えられた場合、それはそのホストにSSHで接続し、そこでコマンドを実行します。
問題:リモートから実行して両方のパラメータを渡すと、このスクリプトを実行した後に末尾プロセスが実行され、ログファイルにコンテンツが正しく入力されていることがわかります。ただし、最初のパラメーターのみを指定すると、reg_tail.pidファイルに新しいプロセスIDが表示されますが、ログファイル($ FILENAME)は作成されず、末尾のプロセスが実行されていないため、末尾から開始して直ちに停止します。
スクリプトは、マシン上で直接実行されると、1つのパラメータまたは両方で完全に実行されます。
「リモートから実行している場合」とは、マシンにSSHで接続してスクリプトを呼び出すという意味です。例えば:
$ ssh -t user@host /path/to/script/script.sh testcasename.log
デバッグ作業
これは、set -xを使用してリモートマシンから実行したときに表示されるものです。
2番目の引数が渡されてすべてが正常に実行されると、最後にnohup tailが実行されます。
....
+ echo 13441
+ '[' 2 -gt 1 ']'
+ SLAVE_HOST=slaveHost
+ ssh slaveHost /path/to/script/startTailLogTestCaseSlave.sh /opt/reg-test- results/REG_09_11_2015/logs2.log
+ nohup tail -f -n0 /path/to/logs/../check-server.log ...
nohup: redirecting stderr to stdout
Connection to hostname closed.
最初の引数だけが渡されると、nohup tailは実行されません。
...
+ echo 13607
+ '[' 1 -gt 1 ']'
Connection to hostname closed.
nohup
そもそもここで?この場合、出力ファイル記述子がめちゃくちゃになる可能性があります。
nohup
そもそも?説明することはここで手元にある問題をデバッグするのを助けるかもしれません。あなたがせずに同じ振る舞いをするならば、それは言われています nohup
まったく、それはそもそもあなたの特定の問題や質問とは何の関係もありません。
ssh hostB scriptname filename hostC
、そして スクリプトが呼び出すssh hostC scriptname filename
?設計を単純化できるかどうかを確認してください。 (2)スクリプトはtail
コマンドの前にssh "$SLAVE_HOST" …
コマンド - しかしあなたのset -x
診断出力ショーtail
後にssh
。それを説明する気がしますか? (3)正当な理由がない限り、シェル変数を引用符で囲む必要があります。 きっと あなたは自分がしていることを知っています。