쉘 스크립트에서 cron 구성

쉘 스크립트에서 cron 구성

다음 줄을 포함하는 쉘 스크립트가 있습니다(게시물 끝에 전체 스크립트가 있음).

CRON_BCK_CMD=/home/user/bck.sh
CRON_CONF=" */30 * *   *   *     $CRON_BCK_CMD"

하지만 단순히 이것을 셸에서 실행하면 다음과 같은 결과 echo $CRON_CONF 가 나타납니다.

*/30 ... /home/user/bck.sh

이는 .../home/user에 나열된 모든 파일을 나타냅니다. 예를 들어*/30 bck.sh bck-ssh.sh Documents davmail.log.../home/user/bck.sh

내 생각엔 스크립트가 내 다른 컴퓨터에서 한 번 실행되었던 것 같습니다. 내가 분명히 하고 싶은 일을 어떻게 합니까?


# SETUP
# CRON_BCK_CMD sets the full path to the backup script
CRON_BCK_CMD=/home/user/bck.sh
# CRON_CONF sets the configuration line for cron, the time is set as:
# minute hour day_of_month month day_of_week
# * means any value, eg. 15 * * * * would mean backup at any hour, any day, when minute on the clock equals 15
# repetition can be managet by /, eg. */15 * * * * means backup every 15 minutes
CRON_CONF=" */30 * *   *   *     $CRON_BCK_CMD"
# SETUP END
CRON_IS_BCK_CMD=$(crontab -l 2>/dev/null | grep $CRON_BCK_CMD) || true
if [[ ! $CRON_IS_BCK_CMD ]]
then
    echo "No entry for backup found in crontab, do you want to schedule?"
    read -p "y/n (y) " REPLY
    if [[ $REPLY =~ ^[n|N]$ ]]
    then
        echo "Nothing to do, exitting..."
        exit 0
    fi
    (crontab -l ; echo "$CRON_CONF") | crontab -
else
    echo "Found crontab entry, do you want to stop schedule?"
    read -p "y/n (y) " REPLY
    if [[ $REPLY =~ ^[n|N]$ ]]
    then
        echo "Nothing to do, exitting..."
        exit 0
    fi
    crontab -l | grep -v $CRON_BCK_CMD | crontab -
fi

답변1

변수의 원래 소스가 아닌 문자열로 변수를 나타내려면 따옴표를 사용하십시오. 그렇지 않고 별표가 슬래시 뒤에 오면 디렉터리 경로 사양에서 "별표 규칙"으로 간주되므로 별표는 지정된 디렉터리의 모든 파일을 나타냅니다.

/bin/bash -c /home/script.sh &CRON을 통해 쉘 스크립트를 실행하려는 경우 일부 문제의 경우 쉘 인터프리터( )를 통해 스크립트를 실행하고 백그라운드에서 작업으로 실행하는 것도 권장됩니다 ( &마지막).

#!/bin/bash

# SETUP
# CRON_BCK_CMD sets the full path to the backup script
CRON_BCK_CMD="/home/user/bck.sh"
# CRON_CONF sets the configuration line for cron, the time is set as:
# minute hour day_of_month month day_of_week
# * means any value, eg. 15 * * * * would mean backup at any hour, any day, when minute on the clock equals 15
# repetition can be managet by /, eg. */15 * * * * means backup every 15 minutes
CRON_CONF="*/30 * * * *      /bin/bash -c $CRON_BCK_CMD &"     # change the Shell to the one used in your Linux (dash, sh, ash, ...)
# SETUP END

if crontab -l | grep "$CRON_BCK_CMD" > /dev/null; then
    echo "Found crontab entry, do you want to stop schedule?"
    read -p "y/n (y): " REPLY
    if [ "$REPLY" != "n" ]; then            # if the "ENTER" key was pressed or the "y" character was typed...
        crontab -l | grep -v "$CRON_BCK_CMD" | crontab -
    fi
else
    echo "No entry for backup found in crontab, do you want to schedule?"
    read -p "y/n (y): " REPLY
    if [ "$REPLY" != "n" ]; then            # if the "ENTER" key was pressed or the "y" character was typed...
        (crontab -l; echo "$CRON_CONF") | crontab -
    fi
fi

exit 0

관련 정보