크론 작업 실패 문제를 해결하는 방법

크론 작업 실패 문제를 해결하는 방법

crontab root다음과 같은 파일이 있습니다 .

lab-1:/var/www/cdd# crontab -l
# do daily/weekly/monthly maintenance
# min   hour    day     month   weekday command
*       *       *       *       *       /etc/scripts/script1
*/15    *       *       *       *       /etc/scripts/script2
0       *       *       *       *       /etc/scripts/script3

다음을 실행하면 모든 작업이 트리거되는 것을 볼 수 있습니다.

lab-1:/var/www/cdd# cat /var/log/messages | grep cron.info
Mar 15 13:00:00 lab-1 cron.info crond[7897]: USER root pid 26217 cmd /etc/scripts/script2
Mar 15 13:00:00 lab-1 cron.info crond[7897]: USER root pid 26219 cmd /etc/scripts/script3        
Mar 15 13:01:00 lab-1 cron.info crond[7897]: USER root pid 26293 cmd /etc/scripts/script1     

문제는 script3(script2와 script1이 작동함을 입증함)가 실제로 예상한 출력을 생성하지 않는다는 것입니다. 다른 폴더에 파일을 만들어야 합니다. 그러나 다음과 같이 수동으로 실행하면 정상적으로 작동합니다.

 lab-1:/etc/scripts# bash script3

저는 실제로 시스템 관리자가 아니기 때문에 이 문제를 해결하는 가장 좋은 방법이 무엇인지 잘 모르겠습니다.

가장 먼저 떠오르는 것은 권한입니다.

lab-1:/etc/scripts# ls -lah                            
total 24                                                                     
drwxr-xr-x    2 root     root        4.0K Mar 15 12:20 .                     
drwxr-xr-x   34 root     root        4.0K Mar 14 17:11 ..                    
-rwxr-xr-x    1 root     root        5.0K Mar 15 12:19 script3
-rwxr-xr-x    1 root     root        1.8K Mar 14 15:26 script1
-rwxr-xr-x    1 root     root        1.9K Mar 14 15:26 script2

/var/log/messages하지만... 그런데 이것이 권한 문제라면 내 파일에서 트리거/시작된 것으로 표시됩니까?

어떻게 진행해야 하나요?

편집 1

lab-1:/etc/scripts# ./script3 | head -n 4                                             
Working folder set to: /tmp/tmp.kOfhip                                                                        
*****Grab SQL Data from Remote Server: spp.mydomain.net *****                                             
COPY 344                                                                                                      
Warning: Permanently added 'spp.mydomain.net,10.1.1.1' (ECDSA) to the list of known hosts.           
Evaluate /tmp/tmp.kOfhip/spp.mydomain.net.db                                                          
lab-1:/etc/scripts#                                                                     

편집 2

내 스크립트는 다음과 같습니다

https://paste.pound-python.org/show/90vAlrOsAYP0CtYqNWfl/

보시다시피 임시 폴더를 만들고 그 안에서 모든 작업을 수행하고 있습니다.

편집 3

9행 같은 라인 때문이 아니라는 것을 스스로 증명하기 위해 1~15행을 제외한 모든 항목을 주석 처리했습니다. 이를 수행하는 16행을 추가했습니다.

 echo "done" >> /tmp/results.txt

그런 다음 작업 일정을 1시간부터 시작하여 2분마다 실행되도록 변경했습니다. 3번이나 실행된 것을 볼 수 있습니다. 작동하지 않거나 폭발하는 것을 찾을 때까지 이 접근 방식을 계속할 것 같습니다. PATH 변수 사용에 대한 아래 설명을 잘 이해하지 못하지만 Google에서 검색해 볼까 생각했습니다.

편집 4

script3의 결과를 파일로 출력하도록 crontabs 루트 파일을 변경했는데 다음과 같습니다.

Working folder set to: /tmp/tmp.GeNGDJ
*****Grab SQL Data from Remote Server: servername *****
COPY 344
Warning: Permanently added 'spp.mydomain.net,10.1.1.132' (ECDSA) to the list of known hosts.
Permission denied (publickey,keyboard-interactive).
Evaluate /tmp/tmp.GeNGDJ/spp.mydomain.net.db
cat: can't open '/tmp/tmp.GeNGDJ/spp.mydomain.net.db': No such file or directory

그래서 파일을 scp하는 동안 죽었습니다. 원격 SQL이 정상적으로 실행되고 출력이 표시됩니다. 하지만 보시다시피 권한이 거부되었지만 동일한 명령을 수동으로 실행하면 작동하는 것 같습니다. 아직도 계속 탐색해야 합니다. 아래 답변에서 제안한 대로 ENV를 덤프하려고 합니다.

답변1

나중에 cron에 의해 실행되는 스크립트를 작성할 때 흔히 저지르는 실수는 스크립트가 로그인하여 개발할 때와 똑같은 환경을 가질 것이라고 가정하는 것입니다. 아직 아님!

다음 줄을 포함하는 스크립트를 작성하세요. 4

OFILE=/tmp/crons.environment
(/usr/bin/whoami
/usr/bin/env ) > $OFILE 2>&1

그리고 cron이 실행하도록 놔두세요

이제 /tmp/crons.environment의 출력을 방금 입력할 때 얻은 출력과 비교해 보세요.env

예를 들어 스크립트에서는 실행하는 모든 프로그램을 찾기 위해 $PATH가 올바르게 설정되어 있고 데이터베이스도 쿼리하고 있다고 가정합니다. 이러한 명령을 올바르게 실행하려면 더 많은 환경 변수가 필요할 수 있습니다.

크론 작업의 출력을 확인하세요. 위에서 했던 것처럼 cron이 실행하는 명령을 임시로 수정하고 stdout 및 stderr을 알려진 파일로 리디렉션합니다.

0       *       *       *       *       /etc/scripts/script3 > /tmp/s3.out 2>&1

관련 정보