web-dev-qa-db-ja.com

crontabではスクリプトが機能しないことを期待してください

スクリプトを期待これを管理ノードで3分ごとに実行して、DCXBrocadeに接続されている各ポートのtx/rx値を収集する必要がありますSANコマンド#portperfshow#

crontabを使用して3分ごとにスクリプトを実行しようとするたびに、スクリプトが機能しません。

私のexpectスクリプトは#!/usr/bin/expect -fで始まり、cronで次の構文を使用してスクリプトを呼び出しています。

3 * * * * /usr/bin/expect -f /root/portsperfDCX1/collect-all.exp sanswitchhostname 

ただし、(cronではなく)スクリプトを実行すると、期待どおりに機能します。

root# ./collect-all.exp sanswitchhostname

正常に動作します。

誰か助けてください!ありがとう。


スクリプトcollect-all.expは次のとおりです。

#!/usr/bin/expect -f

#Time and Date
set day [timestamp -format %d%m%y]
set time [timestamp -format %H%M]

#logging
set LogDir1 "/FPerf/PortsLogs"
et timeout 5
set ipaddr [lrange $argv 0 0]
set passw "XXXXXXX"


if { $ipaddr == "" } {
        puts "Usage: <script.exp> <ip address>\n"
        exit 1
}


spawn ssh admin@$ipaddr
expect -re "password"
send "$passw\r"

expect -re "admin"

                log_file "$LogDir1/$day-portsperfshow-$time"
                send "portperfshow -tx -rx -t 10\r"
                expect timeout "\n"
                send \003
                log_file

                send -- "exit\r"
                close
14
Redouane Nour

スクリプトがで終わることを除いて、同じ問題がありました

interact

最後に、次の2行に置き換えることで機能しました。

expect eof
exit
35
catac

interactexpect eofに変更するとうまくいきました!

exitの部分を削除する必要がありました。これは、bashスクリプトのexpect行の後にステートメントが追加されたためです(bashスクリプト内でexpectを呼び出しています)。

4
sof

シェルから通常実行されるプログラムとcronから実行されるプログラムの間には、2つの重要な違いがあります。

  1. Cronは(多くの)環境変数を設定しません。 TERM、Shell、HOMEは特に存在しませんが、これは定義されない長いリストのほんの一部です。
  2. Cronは現在の端末をセットアップしないため、/ dev/ttyは何にも解決しません。 (Expectによって生成されたプログラムwillには現在のターミナルがあることに注意してください。)

高い確率で、特に最初の問題はこれらから発生します。修正するには、すべての環境変数をインタラクティブセッションに保存し、expectスクリプトでこれらを使用して環境を再設定する必要があります。最も簡単な方法は、この小さなexpectスクリプトを使用することです。

unset -nocomplain ::env(SSH_AUTH_SOCK)   ;# This one is session-bound anyway
puts [list array set ::env [array get ::env]]

これにより、スクリプトの先頭近く(または少なくとも最初のspawnの前)に配置する非常に長い行が1つ書き出されます。次に、それが機能するかどうかを確認します。

3
Donal Fellows

Cronによって実行されるジョブはログインシェルとは見なされないため、.bashrc、.bash_profileなどを取得しません。

この動作が必要な場合は、次のようにcrontabエントリに明示的に追加する必要があります。

$ crontab -l
0 13 * * * bash -c '. .bash_profile; etc ...'
$
0
BillT