Bashスクリプトが実行中に停止する

Bashスクリプトが実行中に停止する

住所、CSV住所および。source IPdestination IPdestination port

私のスクリプトは基本的に2つのテストを実行します。

1パフォーマンス2接続性。

パフォーマンステストでネットワークIOを計算するためsourcedestination(を使用して)にファイルをコピーしました。scpその後、ディスクI / Oを考慮するために、同じファイルがターゲットサーバーのある場所からターゲットサーバーの別の場所にコピーされます。

接続テストで開いていることを確認するncためにfromを実行しています。sourcedestinationport

質問:時には、スクリプトの実行中にある時点で停止して追加のCtrl+C実行を続行するには、[プロセスの終了]をクリックする必要があります。

ここでは、なぜ停止したのかわからず、スクリプトの他の場所に閉じ込められるたびに動作が一貫していません。

この問題を解決するのに役立ちます。必要に応じて、ここにスクリプト全体を公開できます。

修正する:

観察する:私が観察したもう1つのことは、Ctrl + Cを押さないと5分後にスクリプトが自動的に再起動されることです。

実際のスクリプトの一部が付いています。

#Connectivity Test
TMP=$(mktemp)
nc -z -v -n $lastDestinationIP $port >\$TMP
if grep -q "succeeded" <<< cat echo \$TMP;then
   echo $x','$lastSourceIP','$lastDestinationIP','$sourceFqdn','$fqdn','$port',Connectivity,NA,NA,NA,Pass,'$(date) | ssh $username@$baseLocation 'cat >> report.txt'
else
  echo $x','$lastSourceIP','$lastDestinationIP','$sourceFqdn','$fqdn','$port',Connectivity,NA,NA,NA,Fail,'$(date) | ssh $username@$baseLocation 'cat >> report.txt'
fi
rm $TMP
fi
exit
ENDSSH

ほとんどの場合、出口の呼び出し中に中断されます。

これはほとんどの時間中に停止するコードフラグメント(コンソールの)です。

21 14:48:16 EDT 2014 | ssh [email protected] 'cat >> report.txt','Fri Mar
> fi
>
> #rm KB_33.txt
> #rm MB_10.txt
> #rm MB_100.txt
> rm -rf dummy
> else
> #Connectivity Test
> nc -z -v -n -w 2 10.X.X.17 1524 >/tmp/tmp.GJ1knZF5Jn
> if grep -q "succeeded" <<< cat echo /tmp/tmp.GJ1knZF5Jn;then
 21 14:48:16 EDT 2014 | ssh [email protected] 'cat >> report.txt','Fri Mar
> else
21 14:48:16 EDT 2014 | ssh [email protected] 'cat >> report.Fail,'Fri Mar
> fi
> fi
> exit
>

ベストアンサー1

これは短くて甘い-ㅏheredocデフォルトでは、ファイル記述子にストリーミングされるファイルです。

ほとんどの人はその意味ではありません0<<descriptorだからあなたはできます<&0 stdin. ssh渡すstdin呼び出されたプロセスにリンクされるので、heredoc呼び出すリモートシェルに入力を渡します。

非常に特別な品質heredocs違いは次のとおりです。\"'quotedそしてunquoted heredoc LIMITER.だから、<<'THIS'とは違う<<THIS.引用しないときLIMITER,ここで文書の内容を評価してください。${shell:+expansion}一度に${shell:+expansion}完成したら、この文書を他の文書と区別できることはほとんどありません。<~/input

たとえば、

cat <<\QUOTED >~/file
    $(echo "This is ${NOT:-} expanded.")
#END
QUOTED
cat <~/file
> $(echo "This is ${NOT:-} expanded.")
> #END

しかし...

cat <<UNQUOTED >~/file
    $(echo "This is ${NOT:-} expanded.")
#END
UNQUOTED
cat <~/file
> This is  expanded.
> #END

あなたは使い続けるbash <<< herestringそしてcat.正確にどうなるかはわかりませんが、herestringうまくいきますが、賭けるつもりです。cat'sすでに参加しています。だからcatつながるそれ<&0stdinそれでstdout>&1それがすべてです。だから不必要に仕事を複雑にします。<<STDIN<<< catそれ。

次の場合は、実際の問題になる可能性があります。cat消費したくない入力ストリームを消費します。ただ実行% catターミナルでは何も起こっていないようです。なぜなら、ターミナルのstdinそしてstdout同じファイルです - あなたの$(tty)しかし、彼らが異なるとき、catつかむとにかく、そうする意図がなければ、非常に混乱する可能性があります。

私が見るには少し似ていると思います。\'quotes拡張子をスキップしながら$(date)はい$expandedそれではそうかもしれません。: null shell builtin呼び出されて|piped次に引用符なしのコマンド後ろにsshこれは〜になりますcat >> report.failこのファイルには何も生成しないでください。だからcatはい>>appending /dev/null到着report.failその程度は耐えられると思います。または、より可能性が高い限り、exit許可するssh代理人として活動null stream.

そして、文字通りの意味があるか確認してみましたか?$TMP現在の作業ディレクトリにありますか?私は見たENDSSH一番下にはこんな感じです。heredoc LIMITER私の考えでは、それが完全なスクリプトではないか、間違って編集されているようです。使用されるheredocの本文であれば意味があるでしょう。\$TMP,しかし、私の思うようにncまずやる>truncateそれではそれを書いてください。stdout名前付きの人へ$TMP.繰り返しますが、おそらくあなたはrmとにかく、おそらくあなたは気づかなかったでしょう。

そしてあなただからrmイギリス$TMP誰かが次のような質問をしていることに気づかないかもしれません。

どのように$(mktemp)あなたに役立ちます。必要ありません。filename.xxx議論?

修正するあなたの結果を注意深く見ましたが、確かにそうです。>/tmp/tmp.GJ1knZF5Jn方法$(mktemp)働く - でも\$TMP部分。だからあなたは私が指定する必要があると言った。mktemp .xxxファイル名を指定する場合。ありがとうございます。

まだ上のどこかに異端者がいるようだが?おそらくそうではありません。\\ただ方法の副作用を解決しようとしています。echo \$TMP <<<herestring,しかし、わかりません…面白いです。

これらの変数がどこから来るのかわからないので、私の言葉が完全に合っているかどうかはわかりません。しかし、これは私がやるべきことに近いです。

(実際に最後の2つの質問は関係ありません)

_ssh() ( ssh "$1"@"$2" 'printf %s, `cat` >> '"$3"
) <<-PARAMS   
    "$lastSourceIP" 
    "$lastDestinationIP" 
    "$sourceFqdn" 
    "$fqdn" 
    "$port" "
    "ConnectivityNA" 
    "NA" 
    "NA" 
    "Pas" 
    "$(date)"
PARAMS

nc -z -v -n $lastDestinationIP $port |\
    grep -q "succeeded" && suffix=txt
_ssh user host report.${suffix:-fail}
unset suffix
?ENDSSH?

メモ:これ"$quotes"上記はprintf's相手の利害関係sshプロセス - 他に何もありません。それら"quotes"上記の操作をすべて実行した後も同じままです。PARAMS評価される。

私は以前そこで何が起こっているのかをいくつか取り上げました。例えばfunc() ( scope )そう思いたいここを覆って知ってた。これ${parameter:-expansion}そこにも含まれていますが、かなりよく表示されています。ここそしてここ。奇妙なheredocの問題があります。ここここここ。他の人もいるかもしれません。私は殻やものに触れるのが好きなようです。

しかし、この場合は、私が持っている関数とheredocを使ってcatついてはいけません。PARAMS次のように送信されますstdinそしてcat到達すると終了します。EOF(またはCTRL-Dだから一度食べるとPARAMS毎回停止します。これは、このプログラムを次の環境で実行する場合に特に重要です。heredocこれは返品存在する<&0なぜならPARAMS邪魔するだろうcat実行中にスクリプトを食べます。

とにかく、これが役に立つことを願っています。私が逃した部分がある場合は、いつでもお問い合わせください。

おすすめ記事