서버를 설정하기 위해 실행하는 스크립트를 통해 크론 작업을 추가해야합니다. 현재 우분투를 사용하고 있습니다. 사용할 수는 crontab -e
있지만 현재 crontab을 편집하는 편집기가 열립니다. 프로그래밍 방식 으로이 작업을 수행하고 싶습니다.
그렇게 할 수 있습니까?
서버를 설정하기 위해 실행하는 스크립트를 통해 크론 작업을 추가해야합니다. 현재 우분투를 사용하고 있습니다. 사용할 수는 crontab -e
있지만 현재 crontab을 편집하는 편집기가 열립니다. 프로그래밍 방식 으로이 작업을 수행하고 싶습니다.
그렇게 할 수 있습니까?
답변:
크론 작업은 일반적으로 사용자 별 파일에 저장됩니다. /var/spool/cron
가장 간단한 방법은 작업이 구성된 텍스트 파일을 만든 다음 cron 스풀 폴더에 복사하여 올바른 권한을 가지고 있는지 확인하는 것입니다 (600).
다음은 파일에 새 작업을 사용 / 요구하지 않는 단일 라이너입니다.
(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -
은 2>/dev/null
당신이 할 수없는 상황이 발생하지 않도록하는 것이 중요하다 no crontab for username
현재 어떤 crontab을 항목이있는 경우 일부 * nixes도 생산한다는 메시지를.
echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -
희망적으로 이것은 누군가를 돕습니다
사용자 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
, 즉 필수 파일 이름으로 표시합니다. 파이프 된 데이터를 대신 받아들이는 트릭이 있습니까?
stdin
. 대답을 바로 잡겠습니다.
더 간단한 질문에 대한 답변은 다음과 같습니다.
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
우분투에 있을 것 입니다.
Crontab 파일은 단순한 텍스트 파일이므로 다른 텍스트 파일처럼 취급 할 수 있습니다. 의 목적crontab
명령 crontab 파일을보다 안전하게 편집하는 것입니다. 이 명령을 통해 편집 할 때 파일에 오류가 있는지 확인하고없는 경우에만 저장됩니다.
crontab [path to file]
파일에 저장된 crontab을 지정하는 데 사용할 수 있습니다. 처럼crontab -e
오류가없는 경우에만 파일을 설치합니다.
따라서 스크립트는 cron 탭 파일을 직접 쓰거나 임시 파일에 쓰고 crontab [path to temp file]
명령을 사용하여로드 할 수 있습니다 . 직접 쓰면 임시 파일을 쓰지 않아도되지만 안전 점검도 피할 수 있습니다.
crontab [path to file]
.. 더 읽기 쉬운 코드를 허용하기 때문에 이것이 최선의 선택이었습니다. crontab을 사용하여 소포를 추적하고 데스크탑 배경 화면을 상태로 변경합니다. 소포를 기대하지 않으면 매시간 점검 할 필요가 없습니다. 그렇기 때문에 스크립트가 크론 빈도를 자동 편집하기를 원했습니다.
(저는 평판이 충분하지 않으므로 답변으로 추가하고 있습니다. 그의 답변 옆에 의견으로 자유롭게 추가하십시오)
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 -
제안하는 사람들에 대한 수정으로 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=cat
crontab에 cat
파일을 변경하지 않고 표준 출력으로 복사하는 편집기 (일반적인 기본 vi가 아님) 로 사용하도록 지시 합니다. 출력 crontab -
과 다른 형식의 입력이 필요한 경우 여전히 실패 할 수 있습니다 crontab -e
. 최종를 교체하지 마십시오 crontab -
으로 crontab -e
- 그것은 작동하지 않습니다.
그럼 /etc/crontab
그냥 아스키 파일은 그래서 간단한 단지를하다
echo "*/15 * * * * root date" >> /etc/crontab
15 분마다 이메일을 보내는 작업이 추가됩니다. grep
스크립트를 dem 등원으로 만들기 위해 라인이 이미 추가되었는지 여부 를 통해 맛을 조정하고 다른 방법으로 테스트 하십시오.
Ubuntu et al에서는 파일을 삭제 /etc/cron.*
하고 테스트하기가 더 쉬울뿐만 아니라 (시스템) 구성 파일을 엉망으로 만들지 않아도됩니다 /etc/crontab
.
crond
에서는 실제로 모니터링되며 OP의 명시된 플랫폼에서도 작동합니다.
파이썬에서 crontab 배포 도구를 작성했습니다 : https://github.com/monklof/deploycron
pip install deploycron
crontab을 설치하는 것은 매우 쉽습니다. 그러면 crontab이 시스템의 기존 crontab에 병합됩니다.
from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")
cron 작업을 점진적으로 추가하는 방법입니다.
ssh USER_NAME@$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"