Bash 스크립트의 조건부 crontab 명령

Bash 스크립트의 조건부 crontab 명령

특정 조건에 따라 20분 지연으로 실행되도록 스크립트를 예약하기 위해 crontab 명령을 어떻게 호출합니까?

편집: 시스템에서 조건이 true로 평가되는 횟수만큼만 스크립트가 실행되도록 예약하는 명령을 원하는 경우 어떻게 해야 합니까? 내 옵션은 무엇입니까?

답변1

조건을 테스트하기 위한 논리 코드를 스크립트 자체에 넣고 cron에 넣거나 연관시키려고 하지 마십시오. cron은 복잡한 논리를 위해 설계된 것이 아닙니다.

따라서 스크립트에서 조건을 테스트할 수 있으며 조건이 true로 평가되면 처리 코드가 실행됩니다. 평가 결과가 false인 경우 스크립트를 완전히 종료합니다.

처리 스크립트로 인해 "조건"이 변경된다고 가정하면(예: 처리해야 하는 수신 파일이 있는 폴더를 감시하고 20분마다 파일을 처리함) 모든 작업이 모두 완료되었기 때문에 결국 조건은 항상 false로 평가됩니다.

귀하의 의견을 보면 특정 서버의 가용성을 모니터링하고 있는 것으로 보입니다.

나는 bash를 많이 사용하지 않지만 이것은 어떻습니까?

#!/bin/bash

if [ `ps ax | grep $0 | wc -l` -le 3 ]; then     #1
  if [ `arping ...` -ne 1 ]; then                #2
    sleep 1200
    if [ `arping ...` -eq 1 ]; then              #3
      # do your processing here
    fi
  fi
fi

첫 번째 if 문(#1)은 이것이 실행 중인 특정 스크립트의 유일한 인스턴스임을 확인합니다. 다른 스크립트가 (아직) 실행 중이면 종료하고 아무 작업도 수행하지 않습니다.

두 번째(#2)는 초기 "호스트에 핑을 보낼 수 있는지" 테스트입니다. 그렇지 않은 경우 스크립트는 1200초(20분) 동안 기다린 후 다시 테스트합니다(#3).

따라서 두 번의 핑(20분 간격)이 호스트에 있음을 나타내는 경우~이 되다도달 가능하면 처리 코드가 실행됩니다.

조금 단순화하고 싶다면 다음을 시도해 보세요.

#!/bin/bash

if [ `arping -w 59 ...` -ne 1 ]; then
  sleep 1079
  if [ `arping -w 59 ...` -eq 1 ]; then
    # do your processing here
  fi
fi

확인을 위해 arp 차단 시간을 1분 미만(-w 59)으로 설정하고 수면 양을 조정하면 두 테스트 사이의 수면이 20분 이내에 완료된다는 것을 거의 보장할 수 있으므로, t 인접한 기간과 겹치며 다른 스크립트가 아직 실행 중인지 확인할 필요가 없습니다.

물론 위 스크립트 중 하나는 20분마다 실행되는 정적 cron 항목을 통해 호출할 수 있습니다.

*/20 * * * * /path/to/script.sh

답변2

조건을 확인하고 여기에 절전 모드를 할당하려면 bash 스크립트를 작성해야 합니다. 그런 다음 cron을 사용하여 특정 시간에 실행되도록 bash 스크립트를 예약합니다. Cron 자체는 조건문이나 "지연 후 실행"을 지원하지 않습니다.

답변3

좋습니다. 이제 질문을 몇 분으로 업데이트하셨습니다.

따라서 전체 시간 동안 20분 = 0 / 20 / 40 / 60 (=0)분마다 실행됩니다.

항목은 다음과 같습니다.

0,20,40 * * * * /path/to/some_command

제한된 횟수만큼 실행하려면 상태 파일을 사용하여 스크립트를 시작한 횟수를 저장하세요.

관련 정보