프로그래밍 방식으로 새로운 cron 작업을 추가하고 싶습니다.이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
에서 내 연구 , 내가 현재의 crontab을 덤프 다음의 crontab로 그 뒤를 배관, 새로운 하나를 추가 할 수있는 것 같다 :
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
더 좋은 방법이 있습니까?
프로그래밍 방식으로 새로운 cron 작업을 추가하고 싶습니다.이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
에서 내 연구 , 내가 현재의 crontab을 덤프 다음의 crontab로 그 뒤를 배관, 새로운 하나를 추가 할 수있는 것 같다 :
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
더 좋은 방법이 있습니까?
답변:
그것은 항상 나를 위해 잘 작동했습니다.
세 가지 작업을 수행 할 수있는 약간 더 정교한 스크립트를 고려해야합니다.
crontab 줄을 추가하십시오. 존재하지 않는 것을 보증합니다. 이미 존재할 때 추가하는 것은 좋지 않습니다.
crontab 줄을 제거하십시오. 존재하지 않는 경우에만 경고합니다.
crontab 라인을 대체하기 위해 위의 두 기능의 조합.
루트로 실행중인 경우 가장 좋은 방법은 파일을 /etc/cron.d에 놓는 것입니다.
패키지 관리자를 사용하여 소프트웨어를 패키징하는 경우 해당 디렉토리에 파일을 간단히 배치 할 수 있으며 파일이 crontab 인 것처럼 해석되지만 사용자 이름에 대한 추가 필드는 다음과 같습니다.
파일 이름: /etc/cron.d/per_minute
함유량:
* * * * * root /bin/sh /home/root/script.sh
/etc/cron.d/*
있습니까? 확인하기 위해 한 시간 동안 기다려야 할 경우 무언가 작동하는지 알기가 어렵습니다!
OP의 솔루션에 버그가 있으므로 항목을 두 번 추가 할 수 있습니다. 아래를 사용하여 수정하십시오.
(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
sort
전에 uniq
: 예(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
uniq
. 의 -u
옵션을 사용하십시오 sort
.
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 -
희망은 누군가를 도울 것입니다
2>&1 | grep -v "no crontab"
crontab이 없을 때 출력 행 crontab: no crontab for...
이 stderr로 전송 되므로 실제로 필요하지 않습니다 . 출력을 캡처하여 stdout으로 보낸 다음 grep을 사용하여 걸러 낼 이유가 없습니다. crontab: no crontab for...
출력 결과를 보지 않으려면를 사용하십시오 2> /dev/null | sort....
.
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 -
여기에있는 대부분의 솔루션은 crontab에 줄을 추가하기위한 것입니다. 더 많은 제어가 필요한 경우 crontab의 전체 내용을 제어 할 수 있습니다.
배관을 사용하여이 작업을 매우 우아하게 수행 할 수 있습니다.
crontab을 완전히 다시 쓰려면
echo "2 2 2 2 2 /bin/echo foobar" |crontab -
이것은 여기에 설명 된 다른 답변과 쉽게 결합 할 수 있어야합니다
crontab -l | <something> | tee |crontab -
또는 파일에 내용이 있으면 더 간단합니다.
cat <file> |crontab -
중복을 피하는 또 다른 한 줄짜리 방법이 있습니다.
(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 -
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
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');
또한 작업을 /etc/cron.*/에 추가 할 수 있습니다
cron 테이블 텍스트 파일을 직접 편집 할 수도 있지만 솔루션이 완벽하게 허용되는 것처럼 보입니다.