programing

인터랙티브 에디터 없이 Bash를 사용하여 cron 작업을 자동으로 작성하는 방법은 무엇입니까?

newnotes 2023. 4. 20. 22:40
반응형

인터랙티브 에디터 없이 Bash를 사용하여 cron 작업을 자동으로 작성하는 방법은 무엇입니까?

crontab하지 않고 (「Cron」은 「Cron」은 「Cron」의 「Cron」의 「Cron」의 「Cron」의 「Cron」의 「Cron」의 「Cron」의 「Cron」의 「Cron」의 「Cron」).crontab -e 그렇다면 Bash 스크립트에서 cron 작업을 작성하기 위한 코드는 무엇입니까?

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

Cron 행 설명

* * * * * "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 crontab ontab 。 만들어 를 알 수요.crontab -l.

주의: 사용자에게 기존 crontab이 없는 경우 다음 메시지가 표시될 수 있습니다.

no crontab for <username>

어쨌든, 그 메시지를 보더라도 여전히 작동한다.

이 짧은 파일에는 임시 파일이 필요하지 않으며 여러 번 삽입되지 않으며 기존 항목의 스케줄을 변경할 수 있습니다.

예를 들어 다음과 같습니다.

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. redirect)를 합니다.<(*command*)합니다.crontab -l into for for for for for for for for for 에 입력하다fgrep명령어를 입력합니다.
  2. fgrep일치하는 것은 모두 필터링 합니다.$command )-v구분하지 않음( 「」), 「」( 「」)-i옵션)을 클릭합니다.
  3. 다시, 작은 방향 수정 같은 것(<(*command*)는 )의합니다.cat명령어를 입력합니다.
  4. cat도 수신합니다.echo "$job" 설명)자체 설명), 리다이렉트하다(자체 설명), 리다이렉트하다(자체 설명), (자체 설명).<(*command*)를 참조해 주세요.
  5. 은 " " " 입니다.crontab -l 간단한 ★★★★★★★★echo "$job"하여 '|'를 '|'로 변환합니다.crontab -이치노
  6. 그리고 그들은 모두 행복하게 살았답니다!

한마디로:

이 코드 행은 명령어와 일치하는 모든 cron 작업을 필터링한 후 나머지 cron 작업을 새 cron 작업으로 기록하여 사실상 "추가" 또는 "업데이트" 함수처럼 작동합니다.하려면 , , , , , , , , , , , , , , , , , ,의 값을 바꾸면 됩니다.command ★★★★★★★★★★★★★★★★★」job수입니니다다

편집(고정 덮어쓰기):

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

하는 것에 , crontab을 사용하는 , crontab을 사용하는 방법, crontab을 사용하는 방법 등의 .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그 자체입니다.이 파일은 실행할 수 없으며 이름에는 영숫자와 하이픈만 포함해야 합니다(자세한 내용은 아래 참조).

그럼자세히대답하기위해서자세히대답하기위해서자세히대답하기위해서자요?crontab »cron/crond:

crontab -- maintain tables for driving cron for individual users

는 " " 를 합니다.crontab말이 되는 것 같아요

cron -- daemon to execute scheduled commands

다른, 이 를 합니다.cron.

manpage의 간단한 발췌를 통해 해야 할 일과 하지 말아야 할 일의 예를 몇 가지 볼 수 있습니다.

/etc/crontab 및 /etc/crontab.d의 파일은 root에 의해 소유되어야 하며 group-or other-signal이 아니어야 합니다.spool 영역과는 달리 /etc/cron.d 아래의 파일 또는 /etc/cron 아래의 파일입니다.hourly, /etc/syslog.daily, /etc/syslog.weekly 및 /etc/sylinks는 symlink 및 symlink가 가리키는 파일이 모두 루트에 의해 소유되는 경우 symlinks일 수도 있습니다./etc/cron.d 아래의 파일은 실행 가능하지만 /etc/cron 아래의 파일은 실행할 필요가 없습니다.hourly, /etc/syslog.daily, /etc/syslog.weekly 및 /etc/syslog.do를 참조하십시오(자세한 내용은 run-parts(8) 참조).

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

이러한 방법으로 크론을 관리하는 것이 시스템 관점에서 보다 쉽고 확장성이 뛰어나지만 항상 최선의 솔루션이 되는 것은 아닙니다.

데비안, 우분투, 그리고 비슷한 데비안 거점 디스트로스...

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/에 들어갑니다.


* > 리다이렉트를 사용하면 작업 엔트리가 1개뿐임을 보증할 수 있습니다.그러나 기존 파일에 있는 다른 규칙이 모두 날아갈 위험이 있습니다.>에 의한 파기 또는 >>와의 중복이 자신에게 적합한지 여부를 스스로 결정할 수 있습니다.또는 파일명이 존재하는지, 파일명에 어떤 것이 있는지, 어떤 종류의 복제를 추가하는지 확인하기 위해 복잡하거나 관련된 작업을 수행할 수도 있습니다. 하지만 저는 할 일이 있어서 지금 당장은 그렇게 할 수 없습니다.

에서 BASH 스크립트를 사용하여 crontab을 빠르고 지저분하게 작성/치환하기 위해 다음 표기를 사용했습니다.

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

이 작업을 자동화할 가능성이 높기 때문에 단일 작업을 두 번 추가하지 않을 수 있습니다.이 경우 사용:

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

bash bash bash, BASH 를를 bash있 bash bash bash bash bash bash bash bash bash bash bash bash bash bash.DASH(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

다른 범행 수법 질문에서 발견됐어요

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

원하는 문자열을 찾을 수 없는 경우에만 crontab을 편집하는 배리언트:

CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")
(2>/dev/null crontab -l ; echo "0 3 * * * /usr/local/bin/certbot-auto renew") | crontab -
cat <(crontab -l 2>/dev/null) <(echo "0 3 * * * /usr/local/bin/certbot-auto renew") | crontab -

#현재 crontab 쓰기

crontab -l > mycron 2>/dev/null

#새로운 cron을 cron 파일에 추가

echo "0 3 * * * /usr/local/bin/certbot-auto renew" >> mycron

#새 cron 파일 설치

crontab mycron

rm mycron

예를 들어 대부분의 Linux 디스트리뷰션에서 Vixie Cron을 사용하는 경우 개별 cronjob과 함께 /etc/cron.d에 파일을 넣을 수 있습니다.

이것은 당연히 루트에만 효과가 있습니다.시스템에서 이를 지원하는 경우 몇 가지 예가 표시됩니다(이 행에 포함된 사용자 이름은 이전 /etc/crontab 구문과 동일합니다).

일반 사용자로서 이 문제를 처리할 방법이 없다는 것은 cron의 슬픈 오기능이며, 많은 cron 실장에서는 이 문제를 처리할 방법이 전혀 없다는 것입니다.

인터랙티브 에디터 없이 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

이에 대한 제가 선호하는 솔루션은 다음과 같습니다.

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

이렇게 하면 맨 아래에 있는 빈 새 행을 올바르게 처리할 수 있습니다.crontab 관련 문제를 방지하려면 보통 crontab 파일을 공백의 새 행으로 종료해야 합니다.위의 스크립트에서는 먼저 "grep" 부분이 있는 빈 행을 삭제하고 스크립트의 끝에 "\n"이 있는 빈 행을 추가합니다.또한 기존 crontab 파일이 공백 행으로 끝나는 경우에도 새 명령어 위에 공백 행이 표시되지 않습니다.

를 bash에 입니다.crontab 없이

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

grep exact 명령에 -w 매개 변수를 추가하고 -w 매개 변수를 추가하지 않으면 cron 작업 "syslog"가 삭제됩니다.

스크립트 기능을 사용하여 cronjobs를 추가/제거합니다.중복 항목 없음:

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에는 cron 파일을 수정하는 옵션이 없습니다.

현재 cron 파일(crontab -l > newfile)을 가져와 변경 후 새 파일(crontab newfile)을 저장해야 합니다.

perl에 정통한 경우 다음 모듈을 사용할 수 있습니다.설정:: Crontab.

LLP, Andrea

스크립트 함수를 사용하여 cronjobs를 추가합니다.중복된 엔트리를 확인합니다.유용한 표현* > "

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

출처: 내 뇌;)

사용자 "ubuntu"로 로그인했지만 "john"과 같은 다른 사용자의 crontab에 작업을 추가하려고 합니다.다음을 수행할 수 있습니다.

(sudo crontab -l -u john; echo "* * * * * command") | awk '!x[$0]++' | sudo crontab -u john -

이 솔루션의 대부분은, https://www.baeldung.com/linux/create-crontab-script 에서 입수할 수 있습니다.

다른 사용자의 crontab에 작업을 추가하는 데 많은 문제가 있었습니다.크론탭을 계속 복제하거나 완전히 삭제했어요다만, 몇개의 테스트 후에, 이 코드 라인은, 이미 존재하는 작업을 작성하지 않는 것을 포함해, 지정한 유저의 crontab에 새로운 작업을 추가한다고 확신하고 있습니다.

저는 이런 예를 찾고 싶었기 때문에 아마 도움이 될 것입니다.

COMMAND="/var/lib/postgresql/backup.sh"
CRON="0 0 * * *"
USER="postgres"
CRON_FILE="postgres-backup"
# At CRON times, the USER will run the COMMAND
echo "$CRON $USER $COMMAND" | sudo tee /etc/cron.d/$CRON_FILE
echo "Cron job created. Remove /etc/cron.d/$CRON_FILE to stop it."

언급URL : https://stackoverflow.com/questions/878600/how-to-create-a-cron-job-using-bash-automatically-without-the-interactive-editor

반응형