내 스크립트를 실행하는 cronjob에 작은 문제가 있습니다.
스크립트의 모양은 다음과 같으며 이름은 다음과 같습니다 create_report.sh
.
#!/bin/bash
cd /work/directory
/some/command.sh > reports/report_$(date -d "1 day ago" +%Y%m%d).txt
분명히 조금 단순화된 내용이지만 출력을 파일로 작성한 후 해당 파일이 이메일에 첨부되어 나에게 전송됩니다.
"수동으로" 실행하면 제대로 작동하고 파일에 내용이 있다고 보고됩니다.
그런 다음 매일 아침 7시에 스크립트를 실행하고 스크립트의 출력을 음소거하는 crontab-generator.org를 사용하여 cronjob을 만들었습니다.
0 7 * * * /path/to/script/create_report.sh >/dev/null 2>&1
cronjob이 스크립트를 실행하면 보고서 파일이 생성되어 나에게 전송되지만 비어 있습니다. 아마도 이 동작에 대한 해결 방법을 직접 찾을 수는 있지만 이런 일이 발생할 것이라고는 예상하지 못했습니다. 누군가 이런 일이 어떻게 발생하는지 설명하고 이러한 일이 발생하는 올바른 방법을 지적할 수 있습니까?
명확하게 말하면 출력에는 관심이 없지만 create_report.sh
생성되는 보고서 파일에는 관심이 있습니다.
미리 감사드립니다!
답변1
cron이 cron 작업을 실행할 때 (결국) bash를 실행하여 스크립트를 실행하지만 해당 bash 인스턴스는 비대화형이고 로그인 셸이 아니므로 구성 파일을 선택하지 않습니다. 1/some/command.sh
변수를 설정하거나 활동을 수행하기 위해 이러한 구성 파일을 사용하는 경우 다음을 수행해야 합니다 .
- 이 파일을 명시적으로 가져오기, 또는
- 스크립트를 실행하기 전에 BASH_ENV를 올바른 파일로 설정하거나
- 셔뱅라인에서
-i
옵션(load )을 설정~/.bashrc
하거나, - 셔뱅 라인의 설정
-i
및--login
옵션(로드, 또는 중 첫 번째~/.bash_profile
)~/.bash_login
또는~/.profile
- 이러한 변수를 설정하거나 다음 활동을 수행하십시오.
/some/command.sh
인용하다:
각주:
- BASH_ENV를 설정하지 않은 경우
답변2
두 가지 문제가 있습니다.
1.
/some/command.sh > reports/report_$(...).txt
디렉터리에 대한 절대 경로를 제공합니다. reports
예:
/some/command.sh > /home/user/reports/report_$(...).txt
수동으로 작동하므로 cron 데몬에 의해 실행될 때 스크립트가 다른 CWD에서 실행된다고 가정합니다.
2. 동일한 사용자로 이 cronjob을 실행하고 있습니까?
그렇지 않은 경우 이 cronjob을 실행하는 실제 사용자에게 필요한 모든 권한(예: 디렉토리에 쓰기 reports
)이 있는지 확인하세요.
아무것도 작동하지 않으면 시스템 로그(예: tail -f /var/log/syslog | grep CRON
)를 보고 출력(stdout)을 작성하여 이를 수행할 수 있습니다.그리고stderr)을 디스크로:
5 * * * * /path/to/script/create_report.sh >>/tmp/cronlog 2>&1