スクリプトを期待これを管理ノードで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
スクリプトがで終わることを除いて、同じ問題がありました
interact
最後に、次の2行に置き換えることで機能しました。
expect eof
exit
interact
をexpect eof
に変更するとうまくいきました!
exit
の部分を削除する必要がありました。これは、bashスクリプトのexpect行の後にステートメントが追加されたためです(bashスクリプト内でexpectを呼び出しています)。
シェルから通常実行されるプログラムとcronから実行されるプログラムの間には、2つの重要な違いがあります。
高い確率で、特に最初の問題はこれらから発生します。修正するには、すべての環境変数をインタラクティブセッションに保存し、expectスクリプトでこれらを使用して環境を再設定する必要があります。最も簡単な方法は、この小さなexpectスクリプトを使用することです。
unset -nocomplain ::env(SSH_AUTH_SOCK) ;# This one is session-bound anyway
puts [list array set ::env [array get ::env]]
これにより、スクリプトの先頭近く(または少なくとも最初のspawn
の前)に配置する非常に長い行が1つ書き出されます。次に、それが機能するかどうかを確認します。
Cronによって実行されるジョブはログインシェルとは見なされないため、.bashrc、.bash_profileなどを取得しません。
この動作が必要な場合は、次のようにcrontabエントリに明示的に追加する必要があります。
$ crontab -l
0 13 * * * bash -c '. .bash_profile; etc ...'
$