다음 문제에 대한 좋은 해결책을 찾으려고 노력 중입니다.
crontab
일부 기본 규칙이 포함되어 있습니다(A,B,C
).- 파일의 규칙을 crontab에
setup.sh
추가하는 스크립트가 있습니다 (rules 가정 ). 결과 규칙은 다음과 같아야 합니다.my.cron
X,Y,Z
A,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.cron
crontab에 규칙이 존재하는지 확인하십시오. 그렇지 않은 경우 추가하십시오. - 매번 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를 언급하셨으므로 systemd
Universal User Services를 사용하는 것이 좋습니다. 장점은 서비스를 여러 번 활성화해도 이미 활성화된 서비스에 아무런 영향을 미치지 않는다는 것입니다.
1. 범용 사용자 서비스 만들기
예를 들어 생성X
X.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 줄을 약간 변경하면(예: 시작 시간 변경) 이전 줄이 삭제됩니다.