![Crontabの改善点[閉じる]](https://linux33.com/image/213198/Crontab%E3%81%AE%E6%94%B9%E5%96%84%E7%82%B9%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
私のcrontabには31のcronjobがあり、最初の7つのcronjobが完了したら毎週日付を変更します。これらの手作業を減らす他の方法はありますか?
私は各cronjobに特定の日付を設定しようとしています。たとえば、15 00 1,12,22 * * ....
これは良い選択ですか?私の仕事を改善するにはいくつかの提案が必要です。
ありがとうございます。
編集:1日3回、毎週31のテストを実行したいと思います。下の画像は、最初の21のテストに対してcronjobを設定する方法を示しています。
00 00 * * 1 test run 1
00 09 * * 1 test run 2
00 17 * * 1 test run 3
00 00 * * 2 test run 4
00 09 * * 2 test run 5
00 17 * * 2 test run 6
00 00 * * 3 test run 7
00 09 * * 3 test run 8
00 17 * * 3 test run 9
00 00 * * 4 test run 10
00 09 * * 4 test run 11
00 17 * * 4 test run 12
00 00 * * 5 test run 13
00 09 * * 5 test run 14
00 17 * * 5 test run 15
00 00 * * 6 test run 16
00 09 * * 6 test run 17
00 17 * * 6 test run 18
00 00 * * 7 test run 19
00 09 * * 7 test run 20
00 17 * * 7 test run 21
日曜日には、残りの試験運営等の日程を計画いたします。
00 00 * * 1 test run 22
00 09 * * 1 test run 23
00 17 * * 1 test run 24
00 00 * * 2 test run 25
00 09 * * 2 test run 26
00 17 * * 2 test run 27
00 00 * * 3 test run 28
00 09 * * 3 test run 29
00 17 * * 3 test run 30
00 00 * * 4 test run 31
00 09 * * 4 test run 1
00 17 * * 4 test run 2
00 00 * * 5 test run 3
00 09 * * 5 test run 4
00 17 * * 5 test run 5
# (etc.)
答え1
特定の開始時間に連続して31のテストを繰り返すには、スクリプトを使用して次に実行するタスクを追跡し、ファイルのシーケンス番号を使用します。
単一の永続 crontab エントリを使用してすべての時間を指定します。例:
0 0,9,17 * * * /home/paul/JobRotate >> /home/paul/JobRotate.log 2>&1
以下は、最新のジョブ番号を.seqファイルに保存し、存在しない場合に生成するサンプルスクリプトです。
#! /bin/bash --
#.. This is /home/paul/JobRotate.
fn="/home/paul/JobRotate.seq"
[[ -r "${fn}" ]] && read -r Seq < "${fn}"
(( ++Seq ))
printf '%d\n' $(( Seq % 31 )) > "${fn}"
/home/paul/kJob_${Seq}
これはジョブテストスクリプトの例です。
#! /bin/bash --
printf '%s\n' "I am kJob_17" >> /home/paul/JobRotate.log
フルパス名を使用してください。 cronはログインしないため、プロファイル(PATHを含む)はアクティブになりません。厳しい環境: これみんなcronは私にデフォルトのログインシェルも提供していません。
LANGUAGE=en_GB:en
HOME=/home/paul
LOGNAME=paul
PATH=/usr/bin:/bin
LANG=en_GB.UTF-8
SHELL=/bin/sh
PWD=/home/paul
「テスト実行x」の名前が示されているように標準でない場合は、インデックス配列またはシェルケースステートメントを使用してマッピングするか、ソフトリンクを介してアクセスできます。する正式な名前を持ってください。
答え2
Paulのコメントによると、1から31まで繰り返されるラッパースクリプトを作成できます。になりますcron
:
0 0,9,17 * * * wrapper_script
スクリプト自体は次のとおりです。
#!/bin/bash
a=$(cat /tmp/var_)||exit 1
b=$(( ($a)%31+1 ))
run_script $b
echo $b>/tmp/var_
/tmp/var_
スクリプトを初めて使用する前に変数を初期化することを忘れないでください。