프로그래밍 방식으로 새로운 크론 작업을 만들려면 어떻게해야합니까?


129

프로그래밍 방식으로 새로운 cron 작업을 추가하고 싶습니다.이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

에서 내 연구 , 내가 현재의 crontab을 덤프 다음의 crontab로 그 뒤를 배관, 새로운 하나를 추가 할 수있는 것 같다 :

(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -

더 좋은 방법이 있습니까?


2
귀하의 솔루션은 좋은 것 같습니다.
Craig S

Solaris에서는 마지막 crontab에 대한 대시를 제거하십시오. 이미 줄을 추가하지 않도록 grep을 추가 할 수 있습니다.
lacroix1547


괄호 대신 중괄호는 프로세스를 생성하지 않고 수행합니다. 중괄호 주위에 공백을 두십시오. {...; }.
Jay Winston

답변:


-25

그것은 항상 나를 위해 잘 작동했습니다.

세 가지 작업을 수행 할 수있는 약간 더 정교한 스크립트를 고려해야합니다.

  1. crontab 줄을 추가하십시오. 존재하지 않는 것을 보증합니다. 이미 존재할 때 추가하는 것은 좋지 않습니다.

  2. crontab 줄을 제거하십시오. 존재하지 않는 경우에만 경고합니다.

  3. crontab 라인을 대체하기 위해 위의 두 기능의 조합.


78
그는 어떻게 묻고 무엇을 말합니까?
Cerin

1
사용자에게 crontab이없는 경우 어떻게합니까?
Maxim Egorushkin 2016 년

132

루트로 실행중인 경우 가장 좋은 방법은 파일을 /etc/cron.d에 놓는 것입니다.

패키지 관리자를 사용하여 소프트웨어를 패키징하는 경우 해당 디렉토리에 파일을 간단히 배치 할 수 있으며 파일이 crontab 인 것처럼 해석되지만 사용자 이름에 대한 추가 필드는 다음과 같습니다.

파일 이름: /etc/cron.d/per_minute

함유량: * * * * * root /bin/sh /home/root/script.sh


5
사용중인 cron 버전이 /etc/cron.d/를 지원하는지 확인하십시오. 대부분의 최신 Linux 배포판이 있습니다.
sleske

8
이것은 가장 단순하고 가장 우아한 솔루션입니다. 물론 다른 비 관련 항목으로 기존 crontab을 구문 분석하고 편집해야합니다.
Cerin

13
이것에 대한 하나의 잠재적 인 경고는 cron 이이 폴더에 새로운 추가 항목을 선택하는 빈도입니다 (시간당 한 번). 작업이 바로 실행되기를 기대한다면 조심하십시오.
JonathanK

6
@JonathanK, cron에 다시 스캔을 요청할 수 있는지 알고 /etc/cron.d/*있습니까? 확인하기 위해 한 시간 동안 기다려야 할 경우 무언가 작동하는지 알기가 어렵습니다!
15시 57 분

4
이 파일에 대해 perms를 어떻게 설정해야합니까? chmod + x /etc/cron.d/per_minute?
giò

101

OP의 솔루션에 버그가 있으므로 항목을 두 번 추가 할 수 있습니다. 아래를 사용하여 수정하십시오.

(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -

5
설명되지 않은 솔루션이면 실제로 더 좋습니다. 명령이 crontab에 두 번 추가되지 않도록합니다.
Bufke

2
이것은 중복 항목 문제에 대한 좋은 수정이 아닙니다. 그 동안 다른 줄이 crontab에 추가되면 어떻게됩니까?
Hmn

6
다만, 고유성을 보장하기 sort전에 uniq: 예(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
mway

6
필요 없습니다 uniq. 의 -u옵션을 사용하십시오 sort.
papiro

6
crontab을 처음 편집 할 때 사용자crontab 을 피하는 방법 .
wyx

23

cron에 무언가를 추가하려면

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | sort | uniq | crontab -

cron에서 이것을 제거하려면

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | grep -v hupChannel.sh |  sort | uniq | crontab -

희망은 누군가를 도울 것입니다


이것은 내가 찾던 것과 정확히 같습니다. | grep -v '^ #'| 댓글을 걸러 내기
Tjunkie

2
2>&1 | grep -v "no crontab"crontab이 없을 때 출력 행 crontab: no crontab for...이 stderr로 전송 되므로 실제로 필요하지 않습니다 . 출력을 캡처하여 stdout으로 보낸 다음 grep을 사용하여 걸러 낼 이유가 없습니다. crontab: no crontab for...출력 결과를 보지 않으려면를 사용하십시오 2> /dev/null | sort.....
matty


6

간단히 편집기를 tee 명령으로 변경하십시오.

export EDITOR="tee"
echo "0 * * * * /bin/echo 'Hello World'" | crontab -e

3
주의-기존 항목을 지 웁니다.
starfry

5

crontab에 이미 항목이 있다고 가정하면 다음 명령이 비교적 잘 작동합니다. 있습니다 $CMD변수가 가독성 만이있다. 중복을 필터링하기 전에 정렬하는 것이 중요 uniq합니다. 인접한 행에서만 작동 하기 때문 입니다.

CMD='wget -O - -q http://www.example.com/cron.php"'
(crontab -l ; echo "0 * * * * $CMD") | sort | uniq | crontab -

현재 빈 crontab이있는 경우 stderr에 다음 오류가 표시됩니다.

no crontab for user

이것을 피하려면 약간의 복잡성을 추가하고 다음과 같이하십시오.

(crontab -l ; echo "0 * * * * $CMD") 2>&1 | sed "s/no crontab for $(whoami)//"  | sort | uniq | crontab -

5

여기에있는 대부분의 솔루션은 crontab에 줄을 추가하기위한 것입니다. 더 많은 제어가 필요한 경우 crontab의 전체 내용을 제어 할 수 있습니다.

배관을 사용하여이 작업을 매우 우아하게 수행 할 수 있습니다.

crontab을 완전히 다시 쓰려면

echo "2 2 2 2 2 /bin/echo foobar" |crontab -

이것은 여기에 설명 된 다른 답변과 쉽게 결합 할 수 있어야합니다

crontab -l | <something> | tee |crontab -

또는 파일에 내용이 있으면 더 간단합니다.

cat <file> |crontab -

3

중복을 피하는 또 다른 한 줄짜리 방법이 있습니다.

(crontab -l 2>/dev/null | fgrep -v "*/1 *  *  *  * your_command"; echo "*/1 *  *  *  * your_command") | crontab -

다음은 JohnZ의 답변을 수행하고 no crontab for user메시지를 피하는 방법입니다 . 또는 set -eu유형 환경 에서 작동해야 하고 실패를 반환 할 수없는 경우 (이 경우 2>/dev/null부품은 선택 사항 임) :

( (crontab -l 2>/dev/null || echo "")  ; echo "0 * * * * your_command") | sort -u - | crontab -

또는 더 읽기 편하도록 분할하려는 경우 :

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
(echo "$preceding_cron_jobs" ; echo "$new_job") | sort - | uniq - | crontab -

또는 선택적으로 your_command에 대한 참조를 제거하십시오 (예 : 스케줄이 변경된 경우 한 번만 cron'd를 원함). 이 경우 더 이상 필요하지 않습니다 uniq(추가 보너스, 게재 신청서도 보존 됨).

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
preceding_cron_jobs=$(echo "$preceding_cron_jobs" | grep -v your_command )
(echo "$preceding_cron_jobs" ; echo "$new_job") | crontab -

2

man crontab도 유용합니다 :

RONTAB (1)

이름

   crontab - manipulate per-user crontabs (Dillon's Cron)

개요

   crontab file [-u user] - replace crontab from file

   crontab - [-u user] - replace crontab from stdin

   crontab -l [user] - list crontab for user

3
"stdin에서 crontab을 대체한다"라고 말하는 부분은 실제로 절반의 답입니다 :-)
Grodriguez

2

JohnZ의 답변에 덧붙여, sudoer 인 경우 루트로 예약하는 구문은 다음과 같습니다.

(sudo crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | sudo crontab -

1
function cronjob_exists($command){

    $cronjob_exists=false;

    exec('crontab -l', $crontab);


    if(isset($crontab)&&is_array($crontab)){

        $crontab = array_flip($crontab);

        if(isset($crontab[$command])){

            $cronjob_exists=true;

        }

    }
    return $cronjob_exists;
}

function append_cronjob($command){

    if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){

        //add job to crontab
        exec('echo -e "`crontab -l`\n'.$command.'" | crontab -', $output);


    }

    return $output;
}

    append_cronjob('* * * * * curl -s http://localhost/cron/test.php');

1

명령을 추가하기 전에 명령이 아직 존재하지 않는지 확인합니다.

crontab -l 2>/dev/null | grep -q '/path/to/script' || echo "5 * * * * /path/to/script" | crontab -

건배.


0

stdout을 파이핑 crontab하면 macOS에 나를 위해 새로운 crontab이 설치되지 않았으므로 tee하위 쉘 의 편집기를 사용 하여이 솔루션을 대신 찾았습니다 .

(EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh" ) | uniq - | crontab -e)

0

작업을 사용자로 실행하려면 다음을 수행하십시오.

crontab -l | { cat; echo "@weekly what_you_want_to_execute"; } | crontab -

작업을 특권으로 실행하려면 다음을 수행하십시오.

sudo crontab -l | { cat; echo "@weekly what_you_want_to_execute"; } | sudo crontab -

작업 확인 ( 'sudo'유무에 관계없이) :

crontab -l | sed '/^$/d; /#/d'


-2

cron 테이블 텍스트 파일을 직접 편집 할 수도 있지만 솔루션이 완벽하게 허용되는 것처럼 보입니다.


1
동시 편집으로 인해 파일이 손상 될 우려가 있기 때문에이 문제에 대해 답변을들을 수 없습니다. 명령 행 crontab 명령을 사용하면 해당 문제점을 피할 수 있습니다.
Craig S

크레이그, 더 많은 연구가 없다면 커맨드 라인 버전이 원자 적이며 경쟁 조건에 안전하다는 것을 확신하지 못합니다. 어쨌든 "quite safe"일 것입니다.
tuomassalo

루트 액세스 권한이 없으면 "파일을 직접 편집"할 수 없습니다 (사용자의 crontab 파일이 어디에 있는지, cron 데몬이 올바르게 변경 사항을 수신하는지 확인하는 방법을 제공 할 수있는 경우) 우선 조언을 원합니다.
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.