편집하다:나는 이것을 스스로 알아낼 수 있었고 프로세스가 약간 복잡했기 때문에 실제로 원래 질문을 삭제했지만 다른 사람이 유용하다고 생각할 경우를 대비하여 나중에 답변했습니다. RegExp는 주로 숫자 기반 결과를 처리하므로 이 경우 필요하지 않습니다.
원래 질문:
write_cronjob()
전달된 작업이 이미 존재하는지 확인하거나 grep 기준에서 일치하는 항목을 찾지 못하면 crontab에 쓰는 기능이 있습니다 .
일부 네트워크 제한으로 인해 cronjob은 특정 창에서만 예약될 수 있습니다. 사용자는 일정을 자유롭게 설정할 수 있으므로 정의된 창 밖에서 예약을 시도하는 작업은 실행되지 않으므로 스크립트는 이를 감지해야 합니다.
이 함수에는 두 가지 매개변수가 있습니다.
$1
- cron 계획만 포함합니다.0 19 * * 3
$2
- 실행할 작업/명령이 포함되어 있습니다.
필요한 경우 쓰기 작업 전에 병합됩니다.
크론 예약 규칙은 다음 기준을 충족해야 합니다.
- 월요일~금요일(평일)
- 오전 7시(오전 07:00) - 오후 10시(오후 22:00)
낮 부분에 대한 범위 확인을 하려고 생각 중인데 시간 부분은 24시간제(22 = 오후 10시)를 사용하여 좀 더 어렵습니다.
내 요구 사항은 다음과 같습니다
$1
조건부 확인을 위해 cronjob의 시간 및 날짜 부분을 선택하도록 분할할 수 있습니다 .- RegExp 모드/범위는 분할된 부분을 확인하여 기준을 벗어나는지 감지하고
exit 1
그에 따라 확인합니다.
노트:
내 쉘은 ash(BusyBox)이고 배열을 사용할 수 없습니다.
답변1
$1
awk를 사용하여 시간과 날짜 부분을 분할하고 추출 할 수 있습니다 . 기본 구분 기호는 공백이므로 cronjob 시간 값을 잘 분할합니다.
다음 에 대한 예시 값 $1
:0 19 * * 1-5
CRONJOB_HOUR=$(echo "$1" | awk '{ print $2 }') # Second position: 19
CRONJOB_DAY=$(echo "$1" | awk '{ print $5 }') # Fifth position: 1-5
이러한 부분을 변수에 넣어 조건부 검사를 수행할 수 있습니다.
첫 번째 확인은 범위를 생성하기 위한 확인보다 작거나 큼입니다.
if [ "${CRONJOB_HOUR}" -lt 7 ] || [ "${CRONJOB_HOUR}" -gt 22 ] ; then
echo "Cronjob cannot be scheduled within specified hour"
exit 1
fi
두 번째 조건은 1-6과 같은 값을 캡처하는 대신 일치를 기준으로 수행됩니다.
if [[ "${CRONJOB_DAY}" == *"6"* ]] ||
[[ "${CRONJOB_DAY}" == *"7"* ]]
then
echo "Cronjob cannot be set to run at weekends"
exit 1
fi