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

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



답변

다음과 같이 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 .


답변

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

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

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


답변

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

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

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에 새 줄을 추가하지 않고도 일정을 변경할 수 있습니다.

답변

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

코드

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변수 의 값을 바꾸면됩니다 .


답변

편집 (고정 덮어 쓰기) :

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


답변

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

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


답변

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

__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 질문 에서 그것들을 발견했습니다 .