あなたは分指定子を持っ*/30
ています-それは毎分を意味しますが、30のステップで(つまり、30分ごとに)。以来、サブ分の解像度にダウンしていない、あなたは別の方法を見つける必要があります。cron
1つの可能性は、少々簡単ではありませんが(a)、2つのジョブを1つ30秒オフセットすることです。
# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )
コメントを追加してフォーマットし、同期を維持しやすいようにしています。
両方のcron
ジョブは実際には毎分実行されますが、後者はジョブの「肉」を実行する前に30分間待機し/path/to/executable
ます。
他の(非cron
ベースの)オプションについては、ここで他の回答、特にfcron
とに言及しているものを参照してくださいsystemd
。これらは、システムにそれらを使用する能力があることを前提としておそらく望ましいでしょう(インストールfcron
やディストリビューションのインストールなどsystemd
)。
kludgyソリューションを使用したくない場合は、小さな変更を加えたループベースのソリューションを使用できます。プロセスを何らかの形で実行し続けることを管理する必要がありますが、それがソートされると、次のスクリプトが機能するはずです。
#!/bin/env bash
# Debug code to start on minute boundary and to
# gradually increase maximum payload duration to
# see what happens when the payload exceeds 30 seconds.
((maxtime = 20))
while [[ "$(date +%S)" != "00" ]]; do true; done
while true; do
# Start a background timer BEFORE the payload runs.
sleep 30 &
# Execute the payload, some random duration up to the limit.
# Extra blank line if excess payload.
((delay = RANDOM % maxtime + 1))
((maxtime += 1))
echo "$(date) Sleeping for ${delay} seconds (max ${maxtime})."
[[ ${delay} -gt 30 ]] && echo
sleep ${delay}
# Wait for timer to finish before next cycle.
wait
done
コツはペイロードを実行する前sleep 30
にバックグラウンドで開始することです。次に、ペイロードが終了したら、バックグラウンドsleep
が終了するのを待ちます。
ペイロードにn
数秒かかる場合(ここでn <= 30
)、ペイロードの後の待機時間は秒になります30 - n
。30秒以上かかる場合、ペイロードが終了するまで次のサイクルは遅延しますが、それ以上は続きません。
そこには、出力を最初からわかりやすくするために、1分の境界から開始するデバッグコードが含まれていることがわかります。また、最大ペイロード時間を徐々に増やして、最終的にペイロードが30秒のサイクル時間を超えていることを確認します(追加の空白行が出力されるため、効果は明らかです)。
サンプルの実行が続きます(サイクルは通常、前のサイクルの30秒後に開始されます)。
Tue May 26 20:56:00 AWST 2020 Sleeping for 9 seconds (max 21).
Tue May 26 20:56:30 AWST 2020 Sleeping for 19 seconds (max 22).
Tue May 26 20:57:00 AWST 2020 Sleeping for 9 seconds (max 23).
Tue May 26 20:57:30 AWST 2020 Sleeping for 7 seconds (max 24).
Tue May 26 20:58:00 AWST 2020 Sleeping for 2 seconds (max 25).
Tue May 26 20:58:30 AWST 2020 Sleeping for 8 seconds (max 26).
Tue May 26 20:59:00 AWST 2020 Sleeping for 20 seconds (max 27).
Tue May 26 20:59:30 AWST 2020 Sleeping for 25 seconds (max 28).
Tue May 26 21:00:00 AWST 2020 Sleeping for 5 seconds (max 29).
Tue May 26 21:00:30 AWST 2020 Sleeping for 6 seconds (max 30).
Tue May 26 21:01:00 AWST 2020 Sleeping for 27 seconds (max 31).
Tue May 26 21:01:30 AWST 2020 Sleeping for 25 seconds (max 32).
Tue May 26 21:02:00 AWST 2020 Sleeping for 15 seconds (max 33).
Tue May 26 21:02:30 AWST 2020 Sleeping for 10 seconds (max 34).
Tue May 26 21:03:00 AWST 2020 Sleeping for 5 seconds (max 35).
Tue May 26 21:03:30 AWST 2020 Sleeping for 35 seconds (max 36).
Tue May 26 21:04:05 AWST 2020 Sleeping for 2 seconds (max 37).
Tue May 26 21:04:35 AWST 2020 Sleeping for 20 seconds (max 38).
Tue May 26 21:05:05 AWST 2020 Sleeping for 22 seconds (max 39).
Tue May 26 21:05:35 AWST 2020 Sleeping for 18 seconds (max 40).
Tue May 26 21:06:05 AWST 2020 Sleeping for 33 seconds (max 41).
Tue May 26 21:06:38 AWST 2020 Sleeping for 31 seconds (max 42).
Tue May 26 21:07:09 AWST 2020 Sleeping for 6 seconds (max 43).
kludgyソリューションを避けたい場合は、おそらくこれがより良い方法です。cron
このスクリプトが実行されているかどうかを定期的に検出し、実行されていない場合は開始するためのジョブ(または同等のもの)が必要です。ただし、スクリプト自体がタイミングを処理します。
(a)同僚の何人かは、kludgeが私の専門だと言います:-)