스크립트를 통해 crontab을 작성하는 방법


153

서버를 설정하기 위해 실행하는 스크립트를 통해 크론 작업을 추가해야합니다. 현재 우분투를 사용하고 있습니다. 사용할 수는 crontab -e있지만 현재 crontab을 편집하는 편집기가 열립니다. 프로그래밍 방식 으로이 작업을 수행하고 싶습니다.

그렇게 할 수 있습니까?




crontab 항목을 수정하거나 삭제하려면 아래 솔루션을 참조하십시오.
Brian Smith

답변:


11

크론 작업은 일반적으로 사용자 별 파일에 저장됩니다. /var/spool/cron

가장 간단한 방법은 작업이 구성된 텍스트 파일을 만든 다음 cron 스풀 폴더에 복사하여 올바른 권한을 가지고 있는지 확인하는 것입니다 (600).


20
/ var / spool / cron에서 직접 파일을 수정하는 것은 어리둥절합니다. 실제로 파일을 보면 "이 파일을 편집하지 마십시오"와 같은 경고가 첫 번째 줄에 포함됩니다.
Jared

12
@Jared 아이디어에 상당히 동의하지만, "분노하고있다"고 말하는 것은별로 도움이되지 않습니다. 오히려 어떤에게 다른 있는 경우, 편집해야합니다 파일 또는 파일을 수동으로 편집의 위험을 설명합니다. 자동화 된 명령 줄을 통해 일부 cron 작업을 만들 계획 이며이 파일을 편집하는 것이 유일한 옵션이며 심각한 부작용이 없다면 왜 사용하지 않아야하는지 알 수 없습니다.
Balmipour 2012 년

47
실제 답변을 보려면 아래로 스크롤하십시오.
John Red

1
제 생각에는이 답변이 더 좋습니다. stackoverflow.com/a/610860/2681752
galaux

2
나는이 접근법을 취하여 후회했다. RHEL에서 / var / spool / cron 디렉토리는 월드 실행 파일이 아니므로 사용자는 디렉토리를 탐색하고 파일을 수동으로 편집 할 수 없습니다. / var / spool / cron world를 실행 가능하게 만들면 친숙한 로컬 sysadmin이 화를 내며 cronie 패키지를 다시 설치하거나 업데이트하면 권한 변경을 덮어 쓸 수 있습니다.
functionvoid

384

다음은 파일에 새 작업을 사용 / 요구하지 않는 단일 라이너입니다.

(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -

2>/dev/null당신이 할 수없는 상황이 발생하지 않도록하는 것이 중요하다 no crontab for username현재 어떤 crontab을 항목이있는 경우 일부 * nixes도 생산한다는 메시지를.


14
이것이 정답입니다. 내가 추가하고자하는 하나의 라이너가 이미 존재하는지 여부를 확인하는 방법이 필요합니다.
ChrisPrime

7
... 오, 잠깐, 여기에 스크립트를 추가하기 전에 사용자의 crontab에 어떤 것이 있는지 확인하는 방법이 있습니다 : stackoverflow.com/a/14451184/3686125
ChrisPrime

1
이 스크립트가 반복되는 명령으로 사용되고 기존 cron 태스크를 수정하려는 경우 crontab에서 기존 행을 바꾸는 것이 좋습니다. 여러 cron 작업 (control-marker-1, control-marker-2 등)을 제어하는 ​​데 여러 마커를 사용할 수 있습니다. (crontab -l 2> / dev / null | grep -v control-marker-1; echo '* / 5 * * * * / path / to / job -with args # control-marker-1') | crontab을 -
요리사

7
나는 이것이 기존 crontab 항목을 제거하고 다른 사용자 (루트)를 사용해야한다는 것을 알았으므로 기존 항목을 유지하기 위해 다음을 사용했습니다. echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -희망적으로 이것은 누군가를 돕습니다
Danny

60

사용자 crontab (루트 포함)의 경우 다음과 같은 작업을 수행 할 수 있습니다.

crontab -l -u user | cat - filename | crontab -u user -

여기서 "filename"이라는 파일에는 추가 할 항목이 있습니다. sed또는 대신 다른 도구를 사용하여 텍스트 조작을 수행 할 수도 있습니다 cat. crontab파일을 직접 수정하는 대신 명령을 사용해야 합니다.

비슷한 작업은 다음과 같습니다.

{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -

시스템 crontab을 수정하거나 작성하는 경우 일반 텍스트 파일처럼 조작 할 수 있습니다. 그들은에 저장됩니다 /etc/cron.d, /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly디렉토리와 파일에 /etc/crontab/etc/anacrontab.


유망한 것처럼 보였지만 (와 함께 echo) 두 번째 접근법을 시도하면서 "crontab : 사용법 오류 : 파일 이름을 바꾸어야합니다." Cron 매뉴얼 페이지는 구문을로 crontab [ -u user ] file, 즉 필수 파일 이름으로 표시합니다. 파이프 된 데이터를 대신 받아들이는 트릭이 있습니까?
Mark Berry

1
@MarkBerry : 죄송합니다. 파이프에서 하이픈을 사용하여 입력이에서 왔음을 표시해야합니다 stdin. 대답을 바로 잡겠습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

29

우분투 및 기타 여러 배포판에서 /etc/cron.d유효한 crontab 항목이 있는 한 줄이 들어있는 디렉토리에 파일을 넣을 수 있습니다 . 기존 파일에 줄을 추가 할 필요가 없습니다.

매일 실행해야 할 것이 있으면 파일을에 넣으십시오 /etc/cron.daily. 마찬가지로, 당신은 또한에 파일을 삭제할 수 있습니다 /etc/cron.hourly, /etc/cron.monthly하고 /etc/cron.weekly.


5
그러나이 작업을 수행하려면 루트 사용자 여야합니다.
Keith

17

더 간단한 질문에 대한 답변은 다음과 같습니다.

echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root

다음과 같이 원격 서버에서 크론 작업을 설정할 수 있습니다.

#!/bin/bash
servers="srv1 srv2 srv3 srv4 srv5"
for i in $servers
  do
  echo "0 1 * * * /root/test.sh" | ssh $i " tee -a /var/spool/cron/root"
done

Linux에서 crontab파일 의 기본 위치 는 /var/spool/cron/입니다. 여기서 crontab모든 사용자 의 파일을 찾을 수 있습니다 . cronjob 항목을 해당 사용자의 파일에 추가하기 만하면됩니다. 위의 예에서 루트 사용자의 crontab 파일에는 /root/test.sh매일 오전 1시에 실행되도록 cronjob이 추가됩니다 .


/var/spool/cron/crontabs/root우분투에 있을 것 입니다.
Íhor Mé

17

Crontab 파일은 단순한 텍스트 파일이므로 다른 텍스트 파일처럼 취급 할 수 있습니다. 의 목적crontab 명령 crontab 파일을보다 안전하게 편집하는 것입니다. 이 명령을 통해 편집 할 때 파일에 오류가 있는지 확인하고없는 경우에만 저장됩니다.

crontab [path to file]파일에 저장된 crontab을 지정하는 데 사용할 수 있습니다. 처럼crontab -e 오류가없는 경우에만 파일을 설치합니다.

따라서 스크립트는 cron 탭 파일을 직접 쓰거나 임시 파일에 쓰고 crontab [path to temp file]명령을 사용하여로드 할 수 있습니다 . 직접 쓰면 임시 파일을 쓰지 않아도되지만 안전 점검도 피할 수 있습니다.


2
나와 같은 멍청한 놈에게는 그것이 crontab [path to file].. 더 읽기 쉬운 코드를 허용하기 때문에 이것이 최선의 선택이었습니다. crontab을 사용하여 소포를 추적하고 데스크탑 배경 화면을 상태로 변경합니다. 소포를 기대하지 않으면 매시간 점검 할 필요가 없습니다. 그렇기 때문에 스크립트가 크론 빈도를 자동 편집하기를 원했습니다.
Rasmus

1
@Rasmus 훔칠 수있는 멋진 스크립트 인 것 같습니다. 요점이나 비슷한 것을 통해 공유 할 수 있습니까?
cledoux

8

(저는 평판이 충분하지 않으므로 답변으로 추가하고 있습니다. 그의 답변 옆에 의견으로 자유롭게 추가하십시오)

Joe Casadonte의 단일 라이너 는으로 실행하는 set -e경우, 즉 스크립트가 오류로 실패하고 아직 cronjob이없는 경우를 제외하고는 완벽 합니다. 이 경우, 하나의 라이너는 cronjob을 생성하지 않지만 스크립트를 중지하지는 않습니다. 자동 실패는 오해의 소지가 있습니다.

그 이유는 리턴 코드 crontab -l와 함께 1리턴하여 후속 명령 (echo )이 실행되지 않기 때문에 cronjob이 작성되지 않기 때문입니다. 그러나 괄호로 인해 하위 프로세스로 실행되므로 스크립트를 중지하지 않습니다.

(재미있게, 같은 명령을 다시 실행하면 작동합니다. 한 번 실행 crontab -하면 crontab -l여전히 아무것도 출력하지 않지만 더 이상 오류를 반환하지 않습니다 ( no crontab for <user>더 이상 메시지 가 표시되지 않음 ) 따라서 후속 명령 echo이 실행됩니다 crontab이 생성됩니다)

어쨌든로 실행 set -e하면 행은 다음과 같아야합니다.

(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -

예, 이건 더 완벽합니다.
Yngve Sneen Lindal

7

제안하는 사람들에 대한 수정으로 crontab -l | crontab -: 이것은 모든 시스템에서 작동하지는 않습니다. 예를 들어, 이전 버전의 SUSE를 실행하는 수십 대의 서버에서 루트 크론 탭에 작업을 추가해야했습니다 (이유 묻지 않음). 올드 SUSEs는의 출력에 주석 행 앞에 추가 crontab -l하고, crontab -l | crontab -비 나무 등을 (데비안의 기본 동작을 변경되는 Vixie 크론의 그 버전은 crontab 맨 페이지에서이 문제를 인식하고 패치 crontab -l).

crontab -l주석 이 추가 된 시스템에서 프로그래밍 방식으로 crontab을 편집하려면 다음을 시도하십시오.

EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -

EDITOR=catcrontab에 cat파일을 변경하지 않고 표준 출력으로 복사하는 편집기 (일반적인 기본 vi가 아님) 로 사용하도록 지시 합니다. 출력 crontab -과 다른 형식의 입력이 필요한 경우 여전히 실패 할 수 있습니다 crontab -e. 최종를 교체하지 마십시오 crontab -으로 crontab -e- 그것은 작동하지 않습니다.


4

그럼 /etc/crontab그냥 아스키 파일은 그래서 간단한 단지를하다

 echo "*/15 * * * *   root     date" >> /etc/crontab

15 분마다 이메일을 보내는 작업이 추가됩니다. grep스크립트를 dem 등원으로 만들기 위해 라인이 이미 추가되었는지 여부 를 통해 맛을 조정하고 다른 방법으로 테스트 하십시오.

Ubuntu et al에서는 파일을 삭제 /etc/cron.*하고 테스트하기가 더 쉬울뿐만 아니라 (시스템) 구성 파일을 엉망으로 만들지 않아도됩니다 /etc/crontab.


1
실제로 대부분의 구현이 수행하더라도 crontab의 변경 사항을 모니터링하는 데 기술적으로 크론은 필요하지 않으므로 나중에 crontab -e를 호출하여 권장합니다. crontab -e는 메모리가 제공되는 경우 EDITOR 변수를 사용하므로 잠시 동안 / bin / true로 설정하면 crontab을 다시 읽게됩니다.
울리히 슈바르츠

1
그러나 최근의 모든 Linux 시스템 crond 에서는 실제로 모니터링되며 OP의 명시된 플랫폼에서도 작동합니다.
Dirk Eddelbuettel

루트이고 스크립트가 루트로 실행되기를 원하는 경우에만. OP의 경우에는 바람직하지 않을 수 있습니다.
Keith

/ etc / crontab에는 루트가 아닌 항목이 많이 있습니다. 파일에 추가하려면 '단지'만 필요합니다. 어쨌든, 언급했듯이 /etc/cron.*/도 있지만 거기에 쓰려면 루트 여야합니다.
Dirk Eddelbuettel

2

cron 파일을 직접 편집하지 않고 cron 항목을 수정하는 방법은 다음과 같습니다.

crontab -l -u <user> | sed 's/find/replace/g' | crontab -u <user> -

cron 항목을 제거하려면 다음을 사용하십시오.

crontab -l -u <user> | sed '/find/d' | crontab -u <user> -

나는 이것이 gaurav가 요구 한 것이 아니라는 것을 알고 있지만 모든 솔루션을 한곳에 가지고 있지 않은 이유는 무엇입니까?


1

파이썬에서 crontab 배포 도구를 작성했습니다 : https://github.com/monklof/deploycron

pip install deploycron

crontab을 설치하는 것은 매우 쉽습니다. 그러면 crontab이 시스템의 기존 crontab에 병합됩니다.

from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")

1

cron 작업을 점진적으로 추가하는 방법입니다.

  ssh USER_NAME@$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.