毎月最後の2番目の稼働日を実行するcronジョブを構築するためにあなたの助けが必要です。以下に示すようにLWを実行できますが、最後から2番目の方法はわかりません。私はあなたの助けを必要とし、ここに助言してください。
@MWEは可能な解決策を提供してくれましたが、すべてのテストシナリオで機能するとは限りません。
code:
#!/bin/bash
date
WEEKDAY=$(date +%u)
# If detect the montday in 2 days.
if [ $(date +%d -d "2 day") -eq 1 ] && [ ${WEEKDAY} -lt 5 ] ; then
echo "This is the 2. last working day of the month"
# If detect the montday in 5 days.
Elif [ $(date +%d -d "5 day") -eq 1 ] && [ ${WEEKDAY} -eq 5 ] ; then
echo "This is the 2. last working day of the month"
else
exit
fi
テストシナリオ:サーバーのシステム日付を2019年8月29日に修正しました(**これはシステムで最後の2番目の稼働日です)
デバッグモードのスクリプトは終了します。
[Oracle@rdbauroral01v ~]$ bash -x ./crontest.sh
+ date
Thu Aug 29 13:28:20 UTC 2019
++ date +%u
+ WEEKDAY=4
++ date +%d -d '2 day'
+ '[' 31 -eq 1 ']'
++ date +%d -d '5 day'
+ '[' 03 -eq 1 ']'
+ exit
ここであなたの助けに感謝します。
Crontabではなくスクリプトで解決するのと同じくらい簡単です。
月の最後の日は常に明日で、明日は1です。
つまり、エポックから現在の日付を秒単位で取得し、24時間を追加します。次に、それが何月の何日であるかを取得しましょう:
TIMESTAMP=$(date +%s)
TIMESTAMP_TOMORROW=$(( $TIMESTAMP + 86400 ))
明日の月を計算する:
DAYOFMONTH=$(date --date="@${TIMESTAMP_TOMORROW}" +%e)
dAYOFMONTH == 1の場合、今日は月の最終日です。その後、あなたがしたいことをしてください。 == 1でない場合、終了します。
代替案はここにあります: https://stackoverflow.com/questions/6139189/cron-job-to-run-on-the-last-day-of-the-month
TODAY=`date +%d`
TOMORROW=`date +%d -d "1 day"`
# See if tomorrow's day is less than today's
if [ $TOMORROW -lt $TODAY ]; then
echo "This is the last day of the month"
# Do stuff...
fi
または:
0 23 28-31 * * [ `/bin/date -d +1day +\%d` -eq 1 ] && myscript.sh
最後だが大事なことは。最終日2.に対して$(($ TIMESTAMP + 86400 * 2))を乗算します。
または:
TOMORROW=$(date +%d -d "2 day")
または:
[ $(/bin/date -d +2day +\%d) -eq 1 ]
Cronジョブを「0 0 20-31 * 1-5 ./scriptname」として設定する必要がありますか?
番号!しかし、それをいつでも実行することは理にかなっていますか?
2.月の最終稼働日を取得する。 %uは、月曜日の1日目から始まります。 %w、日曜日。
WEEKDAY=$(date +%u) TOMORROW=$(date +%d -d "5 day") if [ ${WEEKDAY} -eq 4 ] && [ $TOMORROW -lt 5 ]; then echo "This is the 2. last working day of the month" fi
Crontabでは、実行を平日と月日に制限できます。両方を組み合わせると良いスタートです。したがって、スクリプトが稼働日にのみ実行されるようにすることができます。月曜日に2月(28日など)またはちょうど30日を認識します。毎月31日に終わらない!安全のために、おそらく20〜31日目を使用してください。
field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sunday, or use names)
次のようなCrontabentry:
0 0 20-31 * 1-5 ./scriptname
パーツは見つけやすく、2番目の3番目または4番目の曜日です。どうして?スクリプトは、平日のみcrontabによって実行されます。したがって、土曜日や日曜日を気にする必要はありません。別の方法として、1-5で平日$(date +%u)かどうかを確認できます。これは営業日です。
コードは今簡単です:
あなたは今事件が必要です。月曜日から木曜日までは常に営業日が続きます。したがって、ルールは、2日である場合、1。月曜日、それは2.最終営業日です。金曜日にのみ、2日目の稼働日となるには、5日の月の最初が必要です。または、月の最初が火曜日でなければなりません。
WEEKDAY=$(date +%e)
# 1. If detect the montday in 2 days.
if [ $(date +%d -d "2 day") -eq 1 ] && [ ${WEEKDAY} -lt 5 ] ; then
echo "This is the 2. last working day of the month"
# 1. If detect the montday in 5 days.
Elif [ $(date +%d -d "5 day") -eq 1 ] && [ ${WEEKDAY} -eq 5 ]
echo "This is the 2. last working day of the month"
else
exit
fi
うまくいけば、私は何も見逃しません。