성공할 때까지 밤(예: 23:00~7:00, 그러나 그 이후는 안 됨)에 실행하고 싶은 실패할 수 있는 프로세스가 있습니다.
가능한 해결책은 다음과 같습니다.
- 도우미 스크립트를 시작하려면 23:00에 크론 작업을 추가하세요.
- 도우미 스크립트 내에서 성공할 때까지 프로세스를 재시도하는 백그라운드 하위 셸을 실행하세요.
- 도우미 스크립트 자체에서 시간이 1분마다 한 번씩 여전히 6시 59분 미만인지 확인하고, 그보다 늦은 경우 하위 쉘과 모든 하위 쉘을 종료합니다.
그러나 컴퓨터가 23:00에 종료되고 23:05에 시작되면 실패하므로 bash를 사용한 복잡한 프로세스 관리가 필요하고 매분 깨어나고 파일을 잠가야 할 수도 있으므로 일반적으로 오류가 발생하기 쉬운 접근 방식입니다. 방법.
그러한 작업을 더 쉽게 정의하고 실행할 수 있게 해주는 특별한 소프트웨어나 유사한 소프트웨어가 있습니까?
답변1
한 가지 가능한 접근 방식은 프로그램을 5분마다 실행하는 것입니다(예를 들어). 첫 번째 실행에서 실행 중인 프로세스에 대한 플래그로 파일을 생성하고, 플래그가 있으면 새 실행이 종료됩니다. 또한 프로그램이 성공하면 플래그로 추가 파일을 생성하고, 두 번째 파일이 있으면 프로그램을 실행하지 않습니다. 프로그램이 성공하거나 실패하면 첫 번째 파일을 삭제하는 것을 잊지 마십시오.
07:00에 cron을 실행하여 프로그램을 종료/중지합니다(그리고 성공 파일 플래그가 있는 경우 제거).
답변2
그러나 컴퓨터가 23:00에 종료되고 23:05에 시작되면 실패하므로 bash를 사용한 복잡한 프로세스 관리가 필요하고 매분 깨어나고 파일을 잠가야 할 수도 있으므로 일반적으로 오류가 발생하기 쉬운 접근 방식입니다. 방법.
이 문제를 피하려면 anacron
대신에 사용하십시오.cron
anacron
내 배포판은 일일 작업이 하루에 한 번만 실행되도록 하는 데 사용됩니다 (Ubuntu 20.04).
구성 파일 보기(및 일일 작업만)
/etc/crontab
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
이것은 안전 장치 항목입니다(anacron이 설치되지 않은 경우).06:25에 일일 스크립트 실행, 하지만 정확하게 말씀하신 것처럼 시스템이 06:25에 켜져야 제대로 작동합니다.
언제anacron
예설치 후 구성 파일을 살펴보십시오.
/etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root
# These replace cron's entries
# Frequency (in days) Delay JobId Command
1 5 cron.daily run-parts --report /etc/cron.daily
매일 시작 후 5분마다 anacron
/etc/cron.daily에서 스크립트를 실행합니다.. 그래서 노트북을 10시에 켜고 15시에 다시 켜면 일일 스크립트는 anacron
10시에 시작한 지 5분 후에 한 번만 실행됩니다.
Ubuntu 는 systemd
대신 init
.anacron
/lib/systemd/system/anacron.service
[Unit]
Description=Run anacron jobs
After=time-sync.target
# By default, anacron will not run when no AC power is connected to system.
# If you are using systemd and want to run anacron even when running on
# battery, you should create the following file with the specified content
# and then call "systemctl daemon-reload":
# /etc/systemd/system/anacron.service.d/on-ac.conf:
# [Unit]
# ConditionACPower=
# See /usr/share/doc/anacron/README.Debian for detailed information.
ConditionACPower=true
Documentation=man:anacron man:anacrontab
[Service]
EnvironmentFile=/etc/default/anacron
ExecStart=/usr/sbin/anacron -d -q $ANACRON_ARGS
IgnoreSIGPIPE=false
KillMode=mixed
# Use SIGUSR1 to stop gracefully
KillSignal=SIGUSR1
[Install]
WantedBy=multi-user.target
마지막으로 /lib/systemd/system/anacron.timer
[Unit]
Description=Trigger anacron every hour
[Timer]
OnCalendar=*-*-* 07..23:30
RandomizedDelaySec=5m
Persistent=true
[Install]
WantedBy=timers.target
머리를 비우려면 약간의 정신력이 필요합니다. 나는 그것을 정말 좋아합니다.@로미오 니노프솔루션의 단순성. 단점은 5분마다 확인하고 종료하므로 확장성에 영향을 미친다는 것입니다.
하지만 노트북에 일일 백업 솔루션을 구현했는데(매일 켜지는 것은 아님) 아주 잘 작동했고, 부팅하기 전에 잠시 동안 켤 수도 있었습니다(지연 시간이 5분을 초과하게 했습니다). 잠재적인 새 백업을 실행하지 않고도 내 이메일을 빠르게 확인할 수 있습니다.
anacron -t <configfile>
시스템 구성 파일의 변조를 방지하려면 직접 지정할 수 있습니다.
더 많은 정보를 알고 싶다면:
man anacron
man anacrontab
답변3
가장 간단한 대답은 at
명령과 명령을 timeout
결합하는 것입니다.
스크립트의 전체 경로가 다음과 같다고 가정합니다.$HOME/scripts/your-script.sh
기본 쉘은bash
스크립트에서는 완료하는 데 1초에서 7시간 이상이 걸릴 것으로 가정합니다.
스크립트는 오전 7시에 중지되어야 합니다.
스크립트에 대한 시간 제한이 있는 재시도 루프를 만듭니다.$HOME/scripts/retry-your-script.sh
cat << EOF > $HOME/scripts/retry-your-script.sh
#!/bin/bash
success_marker=$HOME/scripts/success_marker
timeout 25200 '
while [[ ! -e "\$success_marker" ]]; do
$HOME/scripts/your-script.sh && touch \$success_marker
sleep 5s
done
'
EOF
chmod a+x $HOME/scripts/retry-your-script.sh
오늘 23:00에 재시도 스크립트를 실행하세요.$HOME/scripts/retry-your-script.sh
at 23:00 -f $HOME/scripts/retry-your-script.sh
자세한 답변@로미오 니노프그리고 처음에 구현되었습니다.
스크립트의 전체 경로가 다음과 같다고 가정합니다.$HOME/scripts/your-script.sh
기본 쉘은bash
귀하의 스크립트는 다음의 완료 시간을 가정합니다.4분 이하.
script라는 이름의 crontab을 만듭니다.$HOME/scripts/croned-your-script.sh
cat << EOF > $HOME/scripts/croned-your-script.sh
#!/bin/bash
source $HOME/.bash_profile
success_marker=$HOME/scripts/success_marker
if [[ ! -e "\$success_marker" ]]; then
$HOME/scripts/timed-your-script.sh && touch \$success_marker
fi
EOF
chmod a+x $HOME/scripts/croned-your-script.sh
crontab 정리 스크립트를 생성합니다:$HOME/scripts/croned-cleanup.sh
cat << EOF > $HOME/scripts/croned-your-script.sh
#!/bin/bash
source $HOME/.bash_profile
success_marker=$HOME/scripts/success_marker
if [[ -e "\$success_marker" ]]; then
crontab -l | sed "/croned-your-script.sh/d" | crontab
crontab -l | sed "/croned-cleanup.sh/d" | crontab
rm -f "\$success_marker"
fi
EOF
chmod a+x $HOME/scripts/croned-cleanup.sh
crontab 목록에 crontab 스크립트를 연결하세요.$HOME/scripts/croned-your-script.sh
crontab -l | sed "1i */4 22-23,0-6 * * * $HOME/scripts/croned-your-script.sh" | crontab
깨끗한 crontab 스크립트를 crontab 목록에 연결하세요.$HOME/scripts/cron-cleanup.sh
crontab -l | sed "1i 1 6 * * * $HOME/scripts/croned-cleanup.sh" | crontab