test.sh
쉘 스크립트가 있습니다/home/username
파일 test.sh
에는 다음 줄이 포함되어 있습니다.
#!/bin/sh
cd /home/username/bin
sh launch.sh ParameterName
#launch.sh is in /home/username/bin directory
다음과 같이 crontab 항목을 설정했습니다.
* * * * * /home/username/test.sh
터미널에서 실행 하면 /home/username/test.sh
잘 작동합니다. 하지만 작동하지 않습니다 cron
.
답변1
명령줄에서 스크립트를 올바르게 실행하는 데 관련된 거의 모든 문제는 cron
PATH 변수 설정으로 인해 발생합니다. man 5 crontab
Vixie cron 에 따르면 :
On the Debian GNU/Linux system, cron supports the pam_env module, and
loads the environment specified by /etc/environment and /etc/secu‐
rity/pam_env.conf. It also reads locale information from
/etc/default/locale. However, the PAM settings do NOT override the
settings described above nor any settings in the crontab file itself.
Note in particular that if you want a PATH other than "/usr/bin:/bin",
you will need to set it in the crontab file.
cron
다른 시스템 및/또는 기타 구현의 세부 사항은 다를 수 있지만cron에서 전달된 스크립트의 PATH는 셸의 경로보다 더 제한적일 수 있습니다..
이는 스크립트(또는 스크립트에서 호출된 스크립트/프로그램)에 의해 호출된 모든 항목이 예를 들어 내에서 /usr/local/bin
호출될 때 런타임에 발견되지 않음을 의미합니다 cron
.
스크립트를 호출하여 이를 테스트할 수 있습니다.
PATH=/usr/bin:/bin /home/username/test.sh
crontab 파일의 경로를 확장하면 이 문제를 해결할 수 있습니다.
PATH = /usr/local/bin:/usr/bin:/bin
스크립트가 호출되는 실제 줄 앞에. 변수는 대체되지 않습니다(그러므로 이 작업을 수행하지 마십시오 PATH = /usr/local/bin:$PATH
).
스크립트 상단 근처의 로그 파일 중 하나에 echo 문을 포함하는 것도 좋은 습관입니다.
TSTLOG=/var/tmp/myscript.log
echo "invoking script" > "$TSTLOG"
date >> "$TSTLOG"
echo "$PATH" >> "$TSTLOG"
(의도적으로 여기에서 다루었습니다 echo
). 따라서 프로그램이 호출되는지, 어떤 환경에서 이러한 현상이 발생하는지 확인할 수 있습니다.
이메일도 확인해야 합니다. 시스템 자체에서 시스템이 일반 계정으로 이메일을 전달하도록 설정되어 있지 않은 경우. 많은 cron 이메일은 이메일이 없기 때문에 눈에 띄지 않습니다 [email protected]
. 시스템은 단지 cron에 사용되는 로컬 계정이 읽을 수 있는 메시지를 배치합니다.
답변2
두 가지 옵션:
옵션 1 - 갖고 계시나요 chmod +x test.sh
?
이렇게 하면 ./test.sh
대신에 로 실행할 수 있습니다 sh test.sh
.
옵션 2 - 파일을 chmod하지 않으려면 crontab 항목을 다음으로 변경하십시오.
* * * * * /usr/bin/sh /home/username/test.sh
또한 후자를 선택하는 경우 다음을 sh
사용하여 바이너리 위치를 확인 해야 합니다.
which sh