cronで実行すると予想されるスクリプトは失敗しますが、手動で実行すると機能します。

cronで実行すると予想されるスクリプトは失敗しますが、手動で実行すると機能します。

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つのシェルを使用しますが、他のシェルを対話的に使用することもできます。

おすすめ記事