cron은 bash 작업을 실행하지 않습니다

cron은 bash 작업을 실행하지 않습니다

그래서 정말 이상하지만 어쩌면 단순한 것을 봤습니다. 하지만 내가 알아낼 만큼 간단하지는 않습니다. 문제 없이 실행할 수 있는 간단한 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

다음은 귀하의 코드를 기반으로 한 몇 가지 대략적인 추측입니다.

  1. 파일이 어느 디렉토리에 있습니까 "$HOLDER"*.bz2? cd스크립트에 명령이 표시되지 않습니다 . 어쩌면 스크립트가잘못된목차.
  2. $HOLDER변수가 정의되지 않았습니다.
  3. 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

관련 정보