CronからBashスクリプト、Bashスクリプト、Expectスクリプト


0

一連のExpectスクリプトを実行したい。実行のチェーンは次のようになります。Cronジョブはbashスクリプトを開始し、このラッパーは〜11個のbashスクリプトを開始Parallelします-それぞれがスクリプトを呼び出しExpectます。

そのExpect部分まではすべて順調です。2番目のBashスクリプトにParallel部分があり、各期待スクリプトのホスト名をファイルに出力しています。実際、doはグループで表示されますが、Expectスクリプトはすぐに終了します。

Cronジョブの性質上、環境変数をジョブに渡す必要があると聞きました。私はこれまでこれを試しました:

48 9 * * * rm /home/admin/.flag && /home/admin/.profile; /home/admin/nodeTest.sh

nodeTestの重要なコードは次のとおりです。

for i in {1..10}; do
                for chunk in `ls /home/admin/assets/sagLogs/x*`; do
                        cat $chunk | parallel -j 11 -I% --max-args 1 /home/abdmin/oneNode.sh "%"
                        clear
                done
        done

チャンクの長さは11ホスト名です。それらはoneNodeを介してExpectスクリプトを開始するために並列プログラムに入ります-oneNodeはホスト名をIPに変換し、実行するスクリプトを決定します。

これはコマンドラインからうまく機能します。悲しみを与えてくれるだけのCronの仕事。interacttclコマンドが問題を引き起こすことを読みましたが、スクリプトでは使用していません。これは並行して実行される行です:

timeout 80 sudo expect /home/admin/assets/activeTest $sag $ip &

更新:前の行を次のように変更しました:

timeout 80 sudo /usr/bin/expect /home/admin/assets/activeTest $sag $ip &

更新:Expectスクリプトからエラーを検査した後、私が実行しているのは、インポートされたenv変数の不足です。最初のエラーは、TERM変数が==不明であるために発生します。

'unknown': I need something more specific.
    while executing
"exec /usr/bin/clear"
    invoked from within
"puts [exec /usr/bin/clear]"
    (file "/home/admin/assets/activeTest" line 35)

呼び出し元のスクリプト(oneNode)からenvをダンプすると、termが設定されていることがわかります。

TEMR=vt100

そのため、ラッパーに設定されますが、expectスクリプトに継承されることはありません。何をすべきか?

回答:


2

これは間違っています

48 9 * * * rm /home/admin/.flag && /home/admin/.profile; /home/admin/nodeTest.sh

最も重要なのは、.profileをコマンドとして実行することです。このコマンドは、別のプロセスで実行し、そのプロセスが終了すると、環境の変更はすべて消えます。

また、.flag存在しない場合はどうなりますか?プロファイルは処理しませんが、nodeTestスクリプトを実行します。

source.profile を使用することをお勧めします。rm -fファイルがない場合にエラーが発生しないように使用します。.profileにエラーがない場合にのみスクリプトを実行します。

48 9 * * * rm -f /home/admin/.flag; . /home/admin/.profile && /home/admin/nodeTest.sh
# ..................................^
# source the .profile: execute it in the _current_ shell

次に、解析しないlsください。変化する

            for chunk in `ls /home/admin/assets/sagLogs/x*`; do
                    cat $chunk | ...

            for chunk in /home/admin/assets/sagLogs/x*; do
                    cat "$chunk" | ...

ありがとうございました!やってみます。
KuboMD

こんにちはグレン-これは完全に機能するようには見えませんでした。私の期待するスクリプトputs [exec clear]は、tputプログラムを使用する私のスクリプトの1つを指すような行や行のために、非常に速く死にます。何か案は?
KuboMD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.