시작(또는 다시 시작/종료) 시 스크립트를 실행하는 가장 쉬운 방법이지만 오늘 실행되지 않은 경우에만 가능합니까?

시작(또는 다시 시작/종료) 시 스크립트를 실행하는 가장 쉬운 방법이지만 오늘 실행되지 않은 경우에만 가능합니까?

당신이 아는 가장 쉬운 방법은 무엇입니까? 어떤 도구를 사용해도

답변1

스크립트 시작 부분에서 어딘가에 플래그를 터치하면 스크립트에 대한 후속 호출에서 플래그의 존재와 수명을 확인할 수 있습니다.

귀하의 질문은 다소 모호합니다. 먼저, "마지막으로 스크립트를 실행한 후 일정 시간이 지난 후에만 스크립트를 실행하게 하는 방법"을 묻는다고 가정해 보겠습니다.

#!/bin/bash
flag="/var/tmp/$(basename -- $0).flag"
min_age=$(( 60 * 60 * 24 )) # 24 hours

if [ -e "$flag" ] ;then
  (( $(date +%s) - $(date +%s -r "$flag") > min_age )) || exit 1
fi
touch "$flag"

# Proceed with your script
# ...

하지만 "자정 이후로 스크립트가 실행되지 않은 경우에만 스크립트를 실행하려면 어떻게 해야 합니까?"라고 묻는다면...

#!/bin/bash
flag="/var/tmp/$(basename -- $0).flag"

if [ -e "$flag" ] ;then
  [ $(date +%F) = $(date +%F -r "$flag") ] && exit 1
fi
touch "$flag"

# Proceed with your script
# ...

--

"종료 시 스크립트를 실행하는 방법"을 묻는 경우 배포판마다 상황이 많이 다릅니다. 당신은 아마도 그것을 조사하고 싶을 것입니다 /etc/rc6.d. 예를 들어 내 시스템에는 /etc/rc.d/rc.local_shutdown내용을 추가할 수 있습니다. 사용중인 배포판을 언급해야합니다.

아니면 이 스레드를 확인해 보세요... 종료하기 전에 명령 실행

답변2

제일 쉬운크게 문제인데보다, 하지만 가장 쉬운 방법은 을 사용하는 것입니다 cron. 목표를 달성하려면 다른 "구성 요소"가 필요하지만 cron시간 제한 시작 스크립트 역할을 할 수 있는 스케줄러가 필요합니다 boot. 이는 cron시스템 버전이 이 @reboot기능을 제공한다고 가정합니다. "특수" 문자열( , 등)이 man 5 crontab허용되는지 확인을 참조하세요 .@reboot@yearly

즉, 명령줄 에서 cron사용자의 를 편집하는 것과 동일하게 사용하세요.crontabbash

$ crontab -e

그러면 crontab기본 편집기가 열립니다. 다음 줄을 추가합니다.

@reboot sleep 15; /path/to/your/script >> /path/to/your/iofile.txt 2>&1

시스템이 시작될 때마다 스크립트가 실행됩니다.

  • cron스크립트에 필요한 서비스의 상태를 알 수 없으므로 이 명령 sleep 15은 운영 체제에 필요한 모든 시스템 리소스를 마샬링하는 데 15초를 제공하는 데 사용됩니다. 필요한 리소스와 기타 변수에 따라 이보다 더 많거나 적게 필요할 수 있습니다.

  • crontab다음에서 전체 경로 지정을 사용하십시오.환경(특히 PATH) 대화형 셸과는 다릅니다.

  • 스크립트 출력은 stderr다음과 stdout같습니다.리디렉션로컬 파일(io 파일.txt여기). 이것io 파일.txt이 파일은 스크립트에서 발생하는 오류에 쉽게 액세스할 수 있는 방법을 제공합니다. 디버깅에 매우 유용합니다!

스크립트를 실행하기 위한 조건 적용을 요청하셨습니다 @reboot."하지만 오늘 구현되지 않은 경우에만". 이는 다음이 있음을 의미합니다.사용자가 스크립트를 수동으로 실행했을 가능성또는 같은 날 이전에 시스템이 재부팅되었을 수 있습니다.

물론, 그 조건을 만족시키는 것은 당신의 정의에 달려 있습니다."오늘"; 즉, 지난 24시간 내의 "오늘" 또는 같은 날짜의 "오늘"입니다.

이 경우today=24 hours or less, 귀하의 조건은 다음을 충족할 수 있습니다:

#!/bin/bash
LAST_BOOT=$(cat /path/to/your/timestamp.txt)
CURRENT_BOOT=$(date +%s)
ELAPSED_TIME=$((CURRENT_BOOT - LAST_BOOT))
echo $CURRENT_BOOT > /path/to/your/timestamp.txt
# test ELAPSED_TIME < threshold
if [ $((ELAPSED_TIME <= 86400)) ]; then exit; fi

# the balance of your script follows...

에포크 시간은 다음 +%s형식을 사용하여 제공됩니다 date.마이너스두 번의 부팅 시간이 24시간(86,400초)인지 확인합니다.

이 경우today=same date, 귀하의 조건은 다음을 충족할 수 있습니다:

#!/bin/bash
LAST_BOOT=$(cat /path/to/your/timestamp.txt)
CURRENT_BOOT=$(date +%d)
# test for same date
if [ $((CURRENT_BOOT = LAST_BOOT)) ]; then exit; fi 

# the balance of your script follows...

date +%d형식은 날짜만 제공합니다 . 마지막 시작 시간과 명령문의 현재 시간이 동일한지 테스트합니다. if이는 스크립트가 해당 날짜에 실행되었음을 의미합니다.

또는:

방금 작성한 모든 의견을 고려한 후 잠시 생각해 보는 것이 좋습니다 anacron. 널리 사용되지는 않지만 일정 cron이 있다는 장점이 있습니다.@daily"시스템이 시작될 때 실행되도록 작업을 다른 순간으로 이동하세요.". 비교해 볼 수도 있습니다.이점,그리고결점에 비해 cron. 더 깊게 파고 싶다면,이것이 도움이 될 수 있습니다

답변3

당신은 사용을 고려할 수 있습니다나크론.

Anacron을 사용하면 항상 켜져 있지 않은 컴퓨터에서 반복 작업을 예약할 수 있습니다. 이를 달성하기 위해 작업이 마지막으로 실행된 시간을 기록하는 소위 타임스탬프 파일을 유지 관리합니다. 컴퓨터가 켜지면 anacron은 다양한 메커니즘(시작 스크립트, 일반 크론 작업, 시스템 타이머)을 통해 주기적으로 트리거되고 타임스탬프 파일을 기반으로 예정된 작업을 시작합니다.

anacron을 사용하여 하루에 한 번 명령을 실행하려면 다음과 같은 줄을 입력해야 합니다 /etc/anacrontab.

@daily  0   daily-job   command
  • 첫 번째 필드는 빈도이며 @daily, @weekly또는 @monthly임의의 일 수(예: 22일마다)일 수 있습니다.

  • 두 번째 필드는 작업 실행을 시작하기 위해 anacron이 트리거된 후의 지연입니다.

  • 세 번째 필드는 직위입니다.

  • 마지막으로 네 번째 필드는 실행할 명령입니다.

/etc/cron.dailyDebian 파생 제품에서는 anacron(설치된 경우)이 기본적으로 매일, 매주 및 매월 cron 작업을 실행하는 작업을 대신하므로 스크립트를 거기에 넣을 수 있습니다 .

또 다른 옵션은플루론, 동일한 작업(또는 그 이상)을 수행할 수 있지만 이에 대한 개인적인 경험은 없습니다.

관련 정보