그래서 정말 이상하지만 어쩌면 단순한 것을 봤습니다. 하지만 내가 알아낼 만큼 간단하지는 않습니다. 문제 없이 실행할 수 있는 간단한 bash 스크립트를 작성했는데, 크론 작업을 예약한 다음 스크립트를 실행하지 않으면 문제가 발생합니다.
스크립트는 실행 가능하며 오류/문제 없이 수동으로 실행할 수 있습니다. 다음 명령을 사용하여 crontab에 추가해 보았습니다.
# crontab -l
30 * * * * /usr/scripts/test_script.sh
또한 아래에 파일을 추가 /etc/cron.d/test_script
하고 경로와 셸을 지정해 보았습니다.
# cat /etc/cron.d/tes_script
PATH=/bin:/usr/bin:/sbin:/usr/sbin
SHELL=/bin/bash
30 * * * * /usr/scripts/test_script.sh
tailf /var/log/syslog
로그를 확인 하고 다음을 보려고 노력했습니다 .
2월 7일 10:53:01 CRON[29203]: (루트) CMD (/usr/scripts/test_script.sh)
따라서 실행 중인 것처럼 보일 수 있지만 실제로는 그렇지 않습니다(프로그램의 웹 인터페이스에서 볼 수 있는 업데이트 프로세스를 트리거함).
제가 놓친 부분이 있나요? 이게 스크립트야
#!/bin/bash
DIST="ubuntu"
LOGS="/var/logs/test_script.log"
RECIPIENTS="[email protected]"
declare -a POCKET=("release" "security" "updates")
xenial()
{
SERIES="xenial"
for pocket in "${POCKET[@]}"
do
bzip2 -d "$HOLDER"*.bz2
sync-pocks "$pocket" "$SERIES" "$DIST"
sleep 5m
done
return 0
}
precise()
{
SERIES="precise"
for pocket in "${POCKET[@]}"
do
bzip2 -d "$HOLDER"*.bz2
sync-pocks "$pocket" "$SERIES" "$DIST"
sleep 5m
done
return 0
}
xenial &> "$LOGS" &&
precise &>> "$LOGS" ||
cat "$LOGS" | mailx -s "Sync" "$RECIPIENTS"
스크립트에 구문 문제가 있을 수 있나요? 그렇다면 수동으로 실행해도 문제가 없는 이유는 무엇일까요?
답변1
다음은 귀하의 코드를 기반으로 한 몇 가지 대략적인 추측입니다.
- 파일이 어느 디렉토리에 있습니까
"$HOLDER"*.bz2
?cd
스크립트에 명령이 표시되지 않습니다 . 어쩌면 스크립트가잘못된목차. $HOLDER
변수가 정의되지 않았습니다.sync-pocks
당신의 길에?
답변2
cron이 실행되면 해당 구문을 지원하지 않는 "sh" 셸을 사용하여 실행됩니다 &>
. /etc/cron.d/tes_script에 설정한 SHELL 구문에서는 잘 작동하지만 /etc/cron.d의 파일에는 사용하지 않는 다른 구문(사용자 이름을 필드로 추가)이 필요합니다.
이 문제를 해결하려면 SHELL=/bin/bash
자신의 crontab에서 설정하세요.
답변3
매우 늦었지만 해결책을 찾았습니다. -l 옵션을 사용하여 스크립트를 실행하십시오. 로그인 셸에 설정한 변수로 인해 cronjob이 실행되지 않고 오류가 기록되지 않습니다. 매뉴얼 페이지에 따르면:
-l은 bash가 로그인 쉘로 호출된 것처럼 작동하도록 합니다(아래 INVOCATION 참조).
그래서 내 crontab은 다음과 같습니다.
30 * * * * /usr/scripts/test_script.sh