특정 시간에 서버를 일시 중지하고 깨우기 위해 크론 작업을 설정하고 있습니다.
두 가지 명령을 사용하고 있습니다. 월요일부터 목요일까지 운영:
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