대화식 편집기없이 Bash를 사용하여 자동으로 크론 작업을 작성하는 방법은 무엇입니까?


395

crontab에 편집기 (crontab -e)를 사용하지 않고 cron 작업을 작성하기위한 인수가 있습니까? 그렇다면 Bash 스크립트에서 cronjob을 만드는 코드는 무엇입니까?



5
안타깝게도 여기에 가장 많이 답변 된 방법은 crontab을 수정하는 방법을 보여줍니다 (합리적으로 안전한 방법 임). 그러나 이것이 전체적으로 잘못된 접근법이라고 생각합니다. 더 안전하고 간단하게 파일을 {{cron.d}}에 드롭하는 것이 좋으며, 더 자세히 살펴보면 그 방법을 설명하는 저 투표 답변이 있습니다.
gregmac

답변:


539

다음과 같이 crontab에 추가 할 수 있습니다.

#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello" >> mycron
#install new cron file
crontab mycron
rm mycron

크론 라인 설명

* * * * * "command to be executed"
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)

소스 nixCraft .


14
tempfile 또는 mktemp를 사용해야합니다
Paweł Polewicz 2016 년

166
(crontab -l; echo "00 09 * * 1-5 echo hello") | crontab을 -
에도

32
(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab --에도의 answear를 쉽게 복사
WBAR

8
나는 그것을 변경하는 게 좋을 것 ;와 함께 &&하는 경우가 경우에 대한 안전 가드로 crontab -l실패합니다. 그래서 같은 :(crontab -l && echo "0 0 0 0 0 some entry") | crontab -
MacUsers

12
@MacUsers, crontab -lcrontab이 없으면 실패하므로 &&스크립트를 사용 하면 crontab에 첫 번째 항목을 추가 할 수 없습니다.
JPhi1618

312

당신은 즉석에서 그것을 할 수 있습니다

crontab -l | { cat; echo "0 0 0 0 0 some entry"; } | crontab -

crontab -l현재 crontab 작업을 나열하고, cat인쇄하고, echo새 명령을 인쇄하고, 인쇄 crontab -된 모든 내용을 crontab 파일에 추가합니다. 당신은 새로운을 수행하여 효과를 볼 수 있습니다 crontab -l.


3
감사합니다, 당신은 구문을 설명하거나 그것을 설명하는 URL을 가리킬 수 있습니까?
사이트

9
crontab -l현재 crontab 작업을 나열하고, cat인쇄하고, echo새 명령을 인쇄하고, 인쇄 crontab -된 모든 내용을 crontab 파일에 추가합니다. 새로운 기능을 통해 효과를 확인할 수 있습니다crontab -l
nha

3
나를 위해 치료를합니다. 사용자에게 기존 crontab이 없으면이 표시 no crontab for <username>되지만 어쨌든 작동합니다.
fazy

21
Amazon EC2 인스턴스에서 작동하지 않습니다. 대신 (crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -작동합니다.
Stéphane Bruckert

11
이것은 UUcatA 후보로 보입니다 .
ceving

86

이 짧은 파일은 임시 파일이 필요하지 않으며 여러 개의 삽입에 영향을받지 않으며 기존 항목의 일정을 변경할 수 있습니다.

이것들이 있다고 가정 해보십시오.

croncmd="/home/me/myfunction myargs > /home/me/myfunction.log 2>&1"
cronjob="0 */15 * * * $croncmd"

복제하지 않고 crontab에 추가하려면 :

( crontab -l | grep -v -F "$croncmd" ; echo "$cronjob" ) | crontab -

현재 일정에 관계없이 crontab에서 제거하려면 :

( crontab -l | grep -v -F "$croncmd" ) | crontab -

노트:

  • grep -F는 문자열을 정규식으로 해석하고 싶지 않으므로 문자 그대로 문자열과 일치합니다.
  • 또한 시간 예약을 무시하고 명령 만 찾습니다. 이 방법; crontab에 새 줄을 추가하지 않고도 일정을 변경할 수 있습니다.

@ moeseth : 당신은 정교한 수 있습니까?
MoonCactus

당신은 당신의 컴퓨터에 그것을 시도해야
moeseth

2
@ moeseth : 분명히 내 컴퓨터 (Linux)에서 시도했습니다. 나는 무작위로 작동하지 않는 것을 제안하지 않을 것이다 : /
MoonCactus

2
그건 그렇고, 27 명은 (오늘 현재) 잘못 될 수 없습니다. 설정이 작동하지 않는 이유를 설명해 주시면 도와 드리겠습니다.
MoonCactus

2
OSX 문제 일 수 있습니다.
moeseth

40

도와 주셔서 감사합니다. 내가 여기와 다른 곳에서 찾은 것을 함께 정리하면 다음과 같은 결과를 얻었습니다.

코드

command="php $INSTALL/indefero/scripts/gitcron.php"
job="0 0 * * 0 $command"
cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -

나는 반복하지 않고 두 변수의 필요성을 제거하는 방법을 알 수 없었다.

command분명히 내가 예약하고 싶은 명령입니다. 스케줄링 데이터를 job가져와 $command추가합니다. 작업을 수행하는 코드 줄에 두 변수가 별도로 필요했습니다.

세부

  1. duckyflip의 공로로, 나는이 작은 리디렉션 물건 ( <(*command*))을 사용 crontab -l하여 fgrep명령 출력을 출력 으로 바꿉니다 .
  2. fgrep그런 다음 $command( -v옵션), 대소 문자를 구분하지 않는 ( -i옵션) 과 일치하는 항목을 필터링합니다 .
  3. 다시, 작은 방향 전환 (y <(*command*))은 결과를 cat명령 입력으로 다시 변환하는 데 사용됩니다 .
  4. cat명령은 수신 echo "$job"리디렉션 꼬의 사용을 통해, 다시 (자명)을 ( <(*command*)).
  5. 따라서 필터링 된 출력 crontab -l과 단순 echo "$job"결합 된 항목은 파이프되어 ( '|') crontab -최종 기록됩니다.
  6. 그리고 그들은 모두 행복하게 살았습니다!

간단히 말해서 :

이 코드 줄은 명령과 일치하는 모든 cron 작업을 필터링 한 다음 나머지 cron 작업을 새 작업으로 작성하여 "add"또는 "update"함수처럼 효과적으로 작동합니다. 이를 사용하려면 commandjob변수 의 값을 바꾸면됩니다 .


5
다른 사람이 읽을 수 있도록이 방법의 장점은 다른 모든 솔루션과 달리 crontab의 중복 항목에 대해 걱정하지 않고 여러 번 실행할 수 있다는 것입니다. 그 이유는fgrep -v
aleemb

5
기존의 왼쪽에서 오른쪽으로 배관하는 방법을 선호하는 경우 마지막 줄을 다음과 같이 바꾸십시오. crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l
Antoine Lizée

1
@ AntoineLizée, 당신은 대답 "끝에 여분의"l "을 가지고 있습니다.
Henry

26

편집 (고정 덮어 쓰기) :

cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -

이것은 crontab 내용을 대체 할 것입니다
TheBonsai

1
그것은 기존의 crontab 내용에 새 명령을 추가한다, 그래서 내가 볼 오 @TheBonsai, 지금 그것을 고정
duckyflip

3
Bash의 프로세스 대체는 오류를 삼킨다는 점을 명심하십시오. 경우 crontab -l실패하지만, crontab -성공, 당신의 crontab은 한 줄 것입니다.
ceving

13

crontab 사용에 대한 많은 좋은 답변이 있었지만 using과 같은 간단한 방법에 대해서는 언급하지 않았습니다 cron.

사용하여 cron시스템 파일에있는 디렉토리의 장점이 걸릴 것이다 /etc/crontab, /etc/cron.daily,weekly,hourly또는 /etc/cron.d/:

cat > /etc/cron.d/<job> << EOF
SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin 
MAILTO=root HOME=/  
01 * * * * <user> <command>
EOF

이 예제에서는에 파일을 작성 /etc/cron.d/하고 명령을 성공적으로 실행하기위한 환경 변수를 제공 user하고 명령 및 command자체를 제공했습니다. 이 파일은 실행 가능하지 않아야하며 이름에는 영숫자 및 하이픈 만 포함되어야합니다 (자세한 내용은 아래 참조).

그러나 철저한 답변을 제공하기 위해 crontabvs 의 차이점을 살펴 보겠습니다 cron/crond.

crontab -- maintain tables for driving cron for individual users

시스템에서 사용자와 관련하여 작업을 실행하려는 사용자에게는 사용 crontab이 완벽 할 수 있습니다.

cron -- daemon to execute scheduled commands

구성 관리를 사용하거나 다른 사용자의 작업을 관리하려는 경우에는을 사용해야합니다 cron.

맨 페이지에서 발췌 한 간단한 내용은 수행 할 작업과 수행하지 않을 작업에 대한 몇 가지 예를 제공합니다.

/ etc / crontab 및 /etc/cron.d의 파일은 루트가 소유해야하며 그룹 또는 기타 쓰기 가능하지 않아야합니다. 스풀 영역과 달리 /etc/cron.d의 파일 또는 /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly 및 /etc/cron.monthly의 파일도 symlinks 및 symlinks가 가리키는 파일이 모두 루트 소유인 경우. /etc/cron.d에있는 파일은 실행 파일 일 필요는 없지만 /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly 및 /etc/cron.monthly에있는 파일은 다음과 같습니다. 이들은 run-parts에 의해 실행됩니다 (자세한 내용은 run-parts (8) 참조).

출처 : http://manpages.ubuntu.com/manpages/trusty/man8/cron.8.html

이러한 방식으로 크론을 관리하는 것이 시스템 관점에서 더 쉽고 확장 가능하지만 항상 최상의 솔루션은 아닙니다.


1
<job>파일 확장자를 포함해서는 안된다고 언급 할 가치가 있습니다 .
jww

7

자동화하고있을 가능성이 높으며 단일 작업을 두 번 추가하지 않을 수도 있습니다. 이 경우 다음을 사용하십시오.

__cron="1 2 3 4 5 /root/bin/backup.sh"
cat <(crontab -l) |grep -v "${__cron}" <(echo "${__cron}")

BASH를 사용하는 경우에만 작동합니다. 올바른 DASH ( sh) 구문을 알지 못합니다 .

업데이트 : 사용자에게 crontab이없는 경우 작동하지 않습니다. 보다 안정적인 방법은 다음과 같습니다.

(crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab - 

또는 배포판에서 지원하는 경우 별도의 파일을 사용할 수도 있습니다.

echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup

다른 SO 질문 에서 그것들을 발견했습니다 .


bash 대신 sh를 사용합니까?
kvz

여전히 shsh: 1: Syntax error: "(" unexpected 사용하고 있습니다.
Batandwa

BASH를 사용하는 경우에만 작동합니다. 올바른 DASH (sh) 구문을 알지 못합니다. 답변도 업데이트
kvz

1
FWIW, 난 사이에 공간이있는 경우 떠들썩한 파티를 사용하여이 오류가 발생 <하고 (. 수단은 < (실패하지만 <(작품, 일정에 별표 (*) ...이없는 한
doublesharp

나는 이것이 올바른 방법이라고 믿는다 :cat <(crontab -l |grep -v "${CRON}") <(echo "${CRON}") | crontab -
Stanislav

5

BASH 스크립트를 사용하여 crontab을 빠르고 신속하게 생성 / 교체하기 위해이 표기법을 사용했습니다.

crontab <<EOF
00 09 * * 1-5 echo hello
EOF

5

원하는 문자열을 찾을 수없는 경우에만 crontab을 편집하는 변형 :

CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")

3

Vixie Cron을 사용하는 경우 (예 : 대부분의 Linux 배포판에서) 개별 cronjob과 함께 /etc/cron.d에 파일을 넣을 수 있습니다.

이것은 물론 루트에서만 작동합니다. 시스템이이를 지원하면 몇 가지 예가 표시됩니다. (이전 사용자 이름은 이전 / etc / crontab과 같은 구문으로 줄에 포함되어 있습니다)

cron의 슬픈 기능은 일반 사용자로 이것을 처리 할 수있는 방법이 없으며 너무 많은 cron 구현이 이것을 처리 할 수있는 방법이 없다는 것입니다.


2

데비안, 우분투 및 기타 유사한 데비안 기반 배포판에서 ...

구성 파일을 가져 와서 묶어서 실행중인 cron 서비스에 추가하는 cron 작업 연결 메커니즘이 있습니다.

/etc/cron.d/somefilename 아래에 파일을 넣을 수 있습니다. 여기서 somefilename은 원하는 이름입니다.

sudo echo "0,15,30,45 * * * * ntpdate -u time.nist.gov" >> /etc/cron.d/vmclocksync

이것을 분해하자 :

sudo-/ etc 디렉토리에서 cron 구성을 변경하려면 높은 권한이 필요하기 때문에

echo-표준 출력에서 ​​출력을 생성하는 차량. printf, cat ... 잘 작동합니다

"-문자열의 시작 부분에 큰 따옴표를 사용하십시오. 당신은 전문가입니다.

0,15,30,45 * * * *-표준 cron 실행 일정,이 일정은 15 분마다 실행

ntpdate -u time.nist.gov-실행하려는 실제 명령

"-첫 번째 큰 따옴표는 출력되는 줄을 닫기 위해 친구가 필요하기 때문에

>>-덮어 쓰기 대신 이중 리디렉션 추가 *

/etc/cron.d/vmclocksync-vmclocksync는 내가 선택한 파일 이름이며 /etc/cron.d/에 있습니다.


* 리디렉션을 사용한 경우 하나의 작업 항목 만 보장 할 수 있습니다. 그러나 기존 파일에서 다른 규칙을 제거 할 위험이 있습니다. >로 가능한 파괴가 옳거나 >>로 가능한 중복이 당신을위한 것인지 스스로 결정할 수 있습니다. 또는 파일 이름이 있는지, 파일에 존재하는지, 그리고 어떤 종류의 복제본을 추가하는지 여부를 확인하기 위해 복잡하거나 관련이있는 작업을 수행 할 수 있습니다.하지만 할 일이 있고 할 수 없습니다 당신은 지금


2

대화식 편집기없이 cron 작업을 추가하기위한 Bash 스크립트. 아래 코드는 Linux 파일을 사용하여 cronjob을 추가하는 데 도움이됩니다.

#!/bin/bash

cron_path=/var/spool/cron/crontabs/root

#cron job to run every 10 min.
echo "*/10 * * * * command to be executed" >> $cron_path

#cron job to run every 1 hour.
echo "0 */1 * * * command to be executed" >> $cron_path

1
나는 그것이 ooong 한 시간 이었다는 것을 알고있다. 그러나 가장 많이 투표 된 사람은 단지 새로운 사람을 추가하는 대신에 오래된 크론을 제거하기 때문에 이것은 여전히 ​​유일한 좋은 대답이다.
afe

1
이것은 cron을 설치하지 않습니다. 파일에 추가합니다. 새로운 항목을 설치하려면 어떻게 든 cron 프로세스에 알려야합니다.
Apoorv Parijat

1

crontab중복없이 명령을 추가하는 bash 함수는 다음과 같습니다.

function addtocrontab () {
  local frequency=$1
  local command=$2
  local job="$frequency $command"
  cat <(fgrep -i -v "$command" <(crontab -l)) <(echo "$job") | crontab -
}
addtocrontab "0 0 1 * *" "echo hello"

1
CRON="1 2 3 4 5 /root/bin/backup.sh" 
cat < (crontab -l) |grep -v "${CRON}" < (echo "${CRON}")

-w 매개 변수없이 cronjob "testing"을 추가하지 않고 grep 정확한 명령에 -w 매개 변수를 추가하면 cron 작업 "testing123"이 삭제됩니다.

cronjob을 추가 / 제거하는 스크립트 기능. 중복 항목 없음 :

cronjob_editor () {         
# usage: cronjob_editor '<interval>' '<command>' <add|remove>

if [[ -z "$1" ]] ;then printf " no interval specified\n" ;fi
if [[ -z "$2" ]] ;then printf " no command specified\n" ;fi
if [[ -z "$3" ]] ;then printf " no action specified\n" ;fi

if [[ "$3" == add ]] ;then
    # add cronjob, no duplication:
    ( crontab -l | grep -v -F -w "$2" ; echo "$1 $2" ) | crontab -
elif [[ "$3" == remove ]] ;then
    # remove cronjob:
    ( crontab -l | grep -v -F -w "$2" ) | crontab -
fi 
} 
cronjob_editor "$1" "$2" "$3"

테스트 :

$ ./cronjob_editor.sh '*/10 * * * *' 'echo "this is a test" > export_file' add
$ crontab  -l
$ */10 * * * * echo "this is a test" > export_file

crontab에 동일한 명령이 두 번 (다른 시간에 실행)있는 경우 제거는 두 행을 모두 삭제합니다.
Michaelkay

1

이것에 대한 내가 선호하는 해결책은 다음과 같습니다.

(crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -

이렇게하면 맨 아래의 빈 줄 바꿈을 올바르게 처리하게됩니다. crontab과 관련된 문제를 피하려면 보통 빈 줄 바꿈으로 crontab 파일을 끝내야합니다. 그리고 위의 스크립트는 먼저 "grep"으로 빈 줄을 제거합니다. 그런 다음 스크립트 끝에 "\ n"을 추가하여 빈 줄을 끝에 추가합니다. 기존 crontab 파일이 빈 줄로 끝나는 경우 새 명령 위에 빈 줄이 표시되지 않습니다.


1
echo "0 * * * * docker system prune --force >/dev/null 2>&1" | sudo tee /etc/cron.daily/dockerprune

0

아니요, crontab에는 cron 파일을 수정할 수있는 옵션이 없습니다.

현재 cron 파일 (crontab -l> newfile)을 가져 와서 변경 한 다음 새 파일을 제자리에 두십시오 (crontab newfile).

perl에 익숙한 경우이 모듈 Config :: Crontab을 사용할 수 있습니다. .

LLP, 안드레아


0

cronjob을 추가하는 스크립트 기능. 중복 항목, 사용 가능한 표현식 확인 *> "

cronjob_creator () {         
# usage: cronjob_creator '<interval>' '<command>'

  if [[ -z $1 ]] ;then
    printf " no interval specified\n"
elif [[ -z $2 ]] ;then
    printf " no command specified\n"
else
    CRONIN="/tmp/cti_tmp"
    crontab -l | grep -vw "$1 $2" > "$CRONIN"
    echo "$1 $2" >> $CRONIN
    crontab "$CRONIN"
    rm $CRONIN
fi
}

테스트 :

$ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file'
$ crontab  -l
$ */10 * * * * echo "this is a test" > export_file

출처 : 내 뇌;)


-5

기본 편집기를 ed로 변경하고 heredoc을 사용하여 편집 할 수 있습니다.

EDITOR=ed
export EDITOR

crontab -e << EOF
> a
> * * * * * Myscript
> * * * * * AnotherScript
> * * * * * MoreScript
> .
> w
> q
> EOF

앞선 참고 >이 코드에서 은 리턴 / 입력 키를 눌러 새 행을 작성 함을 의미합니다.

수단은 덮어 쓰기 아무것도하지 않습니다 그래서 추가합니다.

.편집이 완료되었음을 의미합니다.

w 수단 변경 물품.

Q의 수단 종료하거나 종료 에디션.

당신은 그것을 확인할 수 있습니다

crontab -l

항목도 삭제할 수 있습니다.

EDITOR=ed
export EDITOR

crontab -e << EOF
> /Myscript/
> d
> .
> w
> q
> EOF

Myscript가있는 crontab 항목이 삭제됩니다.

차원 수단은 내부에 패턴을 삭제 / / .

다시 확인하지 마십시오

crontab -l

이 솔루션은 너무 적은 스크립트 내에서 작동합니다 > 물론 :-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.