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

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

一連のExpectスクリプトを実行したいと思います。実行チェーンは次のとおりです。 cronジョブはbashスクリプトを起動し、このラッパーは約11個のbashスクリプトを起動します。Parallelそれぞれは1つを呼び出しますExpect

そのExpect部分まではすべて大丈夫でした。 2 番目の Bash スクリプトの並列セクションは、予想される各スクリプトのホスト名をファイルに表示します。実際にはグループとして表示されますが、Expectスクリプトはすぐに終了します。

クローンジョブの特性上、ジョブに環境変数を渡す必要があると聞きました。私が今まで試したこと:

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個のホスト名です。並列プログラムに配置され、ExpectスクリプトはoneNodeを介して起動されます。 oneNodeはホスト名をIPに変換し、実行するスクリプトを決定します。

これはコマンドラインでうまく機能します。私に悲しみを与えるのはCronの仕事だけです。私はtclコマンドが問題を引き起こす可能性があることを読んでいますが、私のスクリプトはinteractそれを使用しません。並列に実行される線は次のとおりです。

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

更新:前の行を次に変更します。

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

更新:Expectスクリプトでエラーを確認した後、インポートされた環境変数がありません。最初のエラーは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をダンプすると、その用語が設定されていることがわかります。

TEMR=vt100

したがって、ラッパーに設定されますが、予想されるスクリプトから継承されません。何をすべきか?

答え1

これは間違っています。

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

最も重要なことは.profileをコマンドとして実行- 一度に実行別のプロセスプロセスが終了すると、すべての環境修正が失われます。

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

.profileを使用することをお勧めしますsource。これを使用すると、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" | ...

関連情報