Linux
從 cron 執行時期望腳本失敗,但在手動執行時有效
我在 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 { .. }。這對我有用。