X 시간에서 Y 시간까지 프로그램을 실행하는 가장 간단한 방법은 무엇입니까?

X 시간에서 Y 시간까지 프로그램을 실행하는 가장 간단한 방법은 무엇입니까?

성공할 때까지 밤(예: 23:00~7:00, 그러나 그 이후는 안 됨)에 실행하고 싶은 실패할 수 있는 프로세스가 있습니다.

가능한 해결책은 다음과 같습니다.

  1. 도우미 스크립트를 시작하려면 23:00에 크론 작업을 추가하세요.
  2. 도우미 스크립트 내에서 성공할 때까지 프로세스를 재시도하는 백그라운드 하위 셸을 실행하세요.
  3. 도우미 스크립트 자체에서 시간이 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시에 다시 켜면 일일 스크립트는 anacron10시에 시작한 지 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

관련 정보