덮어쓰거나 복제하지 않고 crontab 규칙 업데이트

덮어쓰거나 복제하지 않고 crontab 규칙 업데이트

다음 문제에 대한 좋은 해결책을 찾으려고 노력 중입니다.

  • crontab일부 기본 규칙이 포함되어 있습니다( A,B,C).
  • 파일의 규칙을 crontab에 setup.sh추가하는 스크립트가 있습니다 (rules 가정 ). 결과 규칙은 다음과 같아야 합니다.my.cronX,Y,ZA,B,C,X,Y,Z
  • crontab my.cron기존 규칙을 덮어쓰므로 사용할 수 없습니다.
  • setup.sh스크립트가 여러 번 호출될 수 있기 때문에 단순히 규칙을 추가할 수는 없습니다 . 그러면 crontab 규칙이 다음과 같이 보일 수 있습니다.A,B,C,X,Y,Z,X,Y,Z,X,Y,Z

내가 생각할 수 있는 몇 가지 해결책은 다음과 같습니다.

  • grep 명령을 실행하여 my.croncrontab에 규칙이 존재하는지 확인하십시오. 그렇지 않은 경우 추가하십시오.
  • 매번 crontab을 재정의할 수 있도록 기존 규칙 없이 새 사용자를 만듭니다.

이 문제를 해결하는 더 우아한 방법이 있는지 궁금합니다. 내가 아는 한, 규칙을 구성하기 위해 파일 세트를 참조하도록 crontab에 지시할 수 있는 방법은 없습니다(중복이나 덮어쓰기 없이).

답변1

내가 아는 한, 규칙을 구성하기 위해 파일 세트를 참조하도록 crontab에 지시할 수 있는 방법은 없습니다(중복이나 덮어쓰기 없이)/

예, 하지만 crontab 사용자에게는 해당되지 않습니다. /etc/cron.d각 cronjob에 대해 별도의 파일을 사용하십시오. 그런 다음 다른 작업에 대해 걱정할 필요 없이 특정 cronjob을 안전하게 추가, 제거 또는 업데이트할 수 있습니다.

답변2

일련의 명령을 사용하여 이를 수행할 수 있습니다. 다음은 이를 수행하는 예제 스크립트입니다.

#get current cron
crontab -l >cron_c
#add new lines
echo "0 * * * * command" >>cron_c
#remove duplicates
sort -u cron_c >cron_n
#install new cron
crontab cron_n

답변3

태그에 Ubuntu를 언급하셨으므로 systemdUniversal User Services를 사용하는 것이 좋습니다. 장점은 서비스를 여러 번 활성화해도 이미 활성화된 서비스에 아무런 영향을 미치지 않는다는 것입니다.

1. 범용 사용자 서비스 만들기

예를 들어 생성XX.service/usr/lib/systemd/user

[Unit]
Description=X service

[Service]
Type=simple
ExecStart=/path/to/X.e

어울리는 것도 있고X.timer

[Unit]
Description=Timer for X

[Timer]
#Run on workdays at 10 AM
OnCalendar=Mon..Fri *-*-* 10:00:00
#mimic anacron:
Persistent=true
Unit=X

[Install]
WantedBy=default.target

Y같은Z

2. 활성화

사용자가 로그인하지 않은 경우에도 서비스가 예상대로 실행되도록 지연을 사용하십시오 cron. 그런 다음 서비스와 타이머를 활성화하십시오. 권한을 사용하면 모든 작업을 수행할 수 있습니다 root.

loginctl enable-linger john jack jill
for user in john jack jill ; do
   systemctl --user -M ${user}@ enable X X.timer
   systemctl --user -M ${user}@ start X.timer
done

또는 모든 사용자가 이 기능을 가져야 하는 경우 --global서비스/타이머 활성화를 사용하십시오.

답변4

스크립트가 항상 똑같은 줄을 생성한다면 sort -u@Romeo Nino가 제안한 것을 수행할 수 있습니다.

약간 다른 접근 방식은 스크립트에서 생성된 줄을 표시하는 것입니다.

crontab -l | grep -v '#-- tag from your script' > cron.tmp
echo "0 * * * * command  #-- tag from your script" >> cron.tmp
crontab cron.tmp
rm cron.tmp

이렇게 하면 스크립트에서 crontab 줄을 약간 변경하면(예: 시작 시간 변경) 이전 줄이 삭제됩니다.

관련 정보