web-dev-qa-db-ja.com

月の「2番目の最終稼働日」に実行するcron式

毎月最後の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

ここであなたの助けに感謝します。

2
nick

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 ]
1
user532085

Cronジョブを「0 0 20-31 * 1-5 ./scriptname」として設定する必要がありますか?

番号!しかし、それをいつでも実行することは理にかなっていますか?

0
MWE

2.月の最終稼働日を取得する。 %uは、月曜日の1日目から始まります。 %w、日曜日。

  1. 通常、最後の稼働日は木曜日です。それで、4。平日。今から6日先を見なければなりません。 ->つまり、最後の2。月の稼働日は、月の5.日より前でなければなりません。
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
0
user532085

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日以内の場合、それは月の最初の日です... 2番目の最後の稼働日です。しかし、土曜日と日曜日はどうですか?

あなたは今事件が必要です。月曜日から木曜日までは常に営業日が続きます。したがって、ルールは、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

うまくいけば、私は何も見逃しません。

0
user532085