
Linuxでファイルを作成して作成したら、Expectスクリプトを実行して生成されたファイルをSFTPサーバーにアップロードするスクリプトがあります。 cronで実行しましたが、何らかの理由でアップロードは常に失敗しますが、シェルでスクリプトを実行するとアップロードは成功します。ログを確認しましたが、プロセスがどこで間違っているかを教えてくれません。
これはシェルスクリプトです
#!/bin/bash
cd /home/mysql/paradata/repoupload || exit
mv /mnt/restrictedreports/Restricted/Corporate/Accounting/GL2013/gldetail.csv /home/mysql/paradata/repoupload 2>/dev/null
mv /mnt/restrictedreports/Restricted/Corporate/Accounting/GL2013/vgldetail.csv /home/mysql/paradata/repoupload 2>/dev/null
test -f gldetail.csv && ./SAFCO.sh
test -f vgldetail.csv && ./SAFCO.sh
if [ -f vgldetail.csv ]; then filename=vgldetail.csv; fi
if [ -f gldetail.csv ]; then filename=gldetail.csv; fi
if [ $filename == gldetail.csv ];
then
./uploadsafco.exp REPOEX > lastftplogsafco.txt
else
./uploadvafco.exp REPOEX > lastftplogvafco.txt
fi
予想されるスクリプトです。
#!/usr/bin/expect -f
set force_conservative 0 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}
set arg1 [lindex $argv 0]
set timeout 30
expect_after {
timeout { puts "Timeout"; exit 1 }
}
spawn sftp not@this
match_max 100000
expect "password: "
send -- "notapassword\r"
expect -exact "\r
sftp> "
send -- "cd /usr/data/r1/ED\r"
expect "sftp> "
send -- "progress\r"
expect -exact "progress\r
Progress meter disabled\r
sftp> "
send -- "put REPOEX\r"
expect "sftp> "
send -- "chmod 777 REPOEX\r"
expect "sftp> "
send -- "bye\r"
expect eof
exit
答え1
「手動操作、cronの失敗」は、ほとんどの場合、次の理由のいずれかが原因で発生します。
- 環境変数の違い:
PATH
など。 - 現在の作業ディレクトリが異なります。
- TTYが見つかりません(おそらくExpectスクリプトには問題ありません)
- 権限(あるユーザーとの対話型テストおよび他のユーザーとのクローン操作)または
- さまざまなシェル:cronコマンドラインで実行されるコマンド自体は1つのシェルを使用しますが、他のシェルを対話的に使用することもできます。
答え2
私が生成したTelnetスクリプトにも同様の問題がありました。タイムアウトを処理するためにExpect_afterが追加されるまで、スクリプトは正常に機能しました。 Expect_after{..}を削除してみてください。私にとっては問題ではありません。