Cronjob 재정의 스크립트 출력 리디렉션

Cronjob 재정의 스크립트 출력 리디렉션

내 스크립트를 실행하는 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

인용하다:

각주:

  1. 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

관련 정보