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 명령줄에서 실행되는 명령 자체는 하나의 셸을 사용하지만 다른 셸을 대화식으로 사용할 수도 있습니다.

답변2

내 생성 텔넷 스크립트에도 비슷한 문제가 있었습니다. 시간 초과를 처리하기 위해 Expect_after가 추가될 때까지 스크립트는 제대로 작동했습니다. Expect_after { .. }를 제거해 보세요. 나에겐 문제가 아니야.

관련 정보