날짜 - 다음 근무일을 구하는 방법(주말은 무시)

날짜 - 다음 근무일을 구하는 방법(주말은 무시)

특정 시간에 서버를 일시 중지하고 깨우기 위해 크론 작업을 설정하고 있습니다.

두 가지 명령을 사용하고 있습니다. 월요일부터 목요일까지 운영:

rtcwake -m mem -t $(date +%s -d "08:00")

또 다른 하나는 금요일에 실행됩니다:

rtcwake -m mem -t $(date +%s -d "monday 08:00")

이 분리를 불필요하게 만드는 것이 가능한지 궁금합니다. date이 말을 이해할 수 있다면 상황 next weekday 08:00이 많이 단순화될 것입니다.

이것이 실제로 가능한지 또는 어떤 구문을 사용해야하는지 찾을 수 없습니다.

나는 기본적으로 토요일과 일요일에 서버가 깨어나는 것을 피하고 싶습니다.

답변1

를 사용하려는 경우 ksh93"다음 영업일 0800"을 쉽게 계산할 수 있는데, 이는 실제로 다음 주의 첫 번째 영업일을 의미한다고 생각합니다. 미국에 거주한다고 가정하면, 주중 첫 근무일은 대개 월요일입니다.

$ printf "%T\n"                
Tue Jan  5 16:04:37 GMT 2021
$ printf "%T\n" "0 8 * * 1"
Mon Jan 11 08:00:00 GMT 2021
$ printf "%(%s)T\n" "0 8 * * 1"
1610352000
$ 

위 작동 방식의 핵심은 "0 8 * * 1"5개의 crontab시간 및 날짜 필드를 나타내는 문자열입니다. crontab(5)이러한 필드에 대한 자세한 내용은 맨페이지를 참조하십시오.

ksh93시간 형식이 이 준 크론탭 항목 형식의 특정 부분을 인식하고 해당 날짜를 지정된 형식으로 출력한다는 사실을 아는 사람은 많지 않습니다 .

답변2

당신은 시도하고 싶을 수도 있습니다

date +%s -d"$(( ( $(date +%w)==5 )?3:1 ))days 8:00"

편집하다:귀하의 의견에 답변하려면 date +%w요일이 생성된 다음 "조건부 연산자"( expr?expr:expr)로 계산됩니다. expr1이 TRUE로 평가되면 expr2가 계산되어 사용되고, 그렇지 않으면 expr3이 사용됩니다. 그러니까 금요일이 5일째이고 date +%s -d"3days 8:00나머지 날도 계속 진행되는 거죠 date +%s -d"1days 8:00.

답변3

비슷한 요구에 대해 제가 생각해낸 아이디어가 있습니다. 다른 답변보다 더 자세하지만 그것이 무엇을 하고 있는지 더 분명하게 만들 수 있습니다.

last_workday() {
    from_date="${@:-today}"
    day_of_week=$(date +%w --date="${from_date}")

    if [ ${day_of_week} = "0" ] ; then
        look_back=2
    elif [ ${day_of_week} = "1" ] ; then
        look_back=3
    else
        look_back=1
    fi

    date -d "${from_date} - ${look_back} day" +'%Y/%m/%d'
}

next_workday() {
    from_date="${@:-today}"
    day_of_week=$(date +%w --date="${from_date}")
    if [ ${day_of_week} = "5" ] ; then
        look_forward=3
    elif [ ${day_of_week} = "6" ] ; then
        look_forward=2
    else
        look_back=1
    fi

    date -d "${from_date} + ${look_forward} day" +'%Y/%m/%d'
}

for i in $(seq 16); do
    now=$(date +'%Y/%m/%d' --date="today + ${i} day")
    prev=$(last_workday "${now}")
    next=$(next_workday "${now}")
    echo "${now}:  ${prev} ${next}"
done

관련 정보