Linux

從 cron 執行時期望腳本失敗,但在手動執行時有效

  • October 11, 2018

我在 Linux 中有一個腳本,它創建一個文件,一旦創建它就會執行一個 Expect 腳本,將創建的文件上傳到 SFTP 伺服器。我在 cron 中執行它,無論出於何種原因,上傳總是失敗,但是當我在 shell 中執行腳本時,上傳成功。我檢查了日誌,他們並沒有真正告訴我這個過程出了什麼問題。

這是shell腳本

#!/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

“手動工作,在 cron 中失敗”幾乎總是由於以下原因之一:

  • 環境變數的差異:PATH和其他;
  • 不同的目前工作目錄;
  • 缺少 TTY(可能不是期望腳本的問題);
  • 權限(與一個使用者進行互動測試,與另一個使用者進行 cron 作業);或者
  • 不同的外殼:在 cron 命令行中執行的命令本身使用一個外殼,您可能正在互動地使用另一個外殼。

我的 spawn telnet 腳本也有類似的問題。腳本工作正常,直到添加 expect_after 處理超時。嘗試刪除 expect_after { .. }。這對我有用。

引用自:https://unix.stackexchange.com/questions/373922