Crontabファイルへのエントリが有効かどうかをbashでチェックインする必要があります。 crontab
コマンドスイッチはありますか?
個々の行を抽出し、正規表現を使用して個々のアイテムを制御しようと試みることはできますが、レコードのタイプを確認する方法がわかりません。 10,20,30
、*/2
、Jan-May,Dec
--それを行う方法について何かアドバイスはありますか?
read -a cron <<< "${cron_tab}"
if [[ "${cron[0]}" =~ ^(@(reboot|yearly|annualy|monthly|weekly|daily|hourly))$ ]]; then
...
#check minutes
if [[ "${cron[0]}" =~ ^([*]|[0-5][0-9]{1})$ ]]; then
...
#check hours
if [[ "${cron[1]}" =~ ^([*]|[01]?[0-9]|2[0-3])$ ]]; then
...
#check days
if [[ "${cron[2]}" =~ ^([*]|[0-2]?[0-9]|3[0-1])$ ]]; then
...
#check months
if [[ "${cron[3]}" =~ ^([*]|[0]?[0-9]|1[0-2])$ ]]; then
...
#check days of week
if [[ "${cron[4]}" =~ ^([*]|[0]?[0-7])$ ]]; then
...
Crontab行が有効かどうかをテストする最も信頼できる方法は、crontab
ユーティリティに問い合わせることです。
ほとんどのcrontab
ユーティリティには、crontabを検証するだけで変更しないオプションがありません。 crontab -e
を呼び出してcrontabを設定できます。これが成功すると、前のコンテンツが復元されますが、これは堅牢ではありません。入力が有効な場合、クロックがたまたま過ぎた場合に、そこに含まれるジョブが開始される可能性があります。前のコンテンツを復元する1分前に、他の誰かが同時にcrontabを変更すると、一方または両方の操作が中断されます。
したがって、できることは、独自の遊び場でcrontab
を呼び出すことです。これを行う1つの方法は、 chroot —本物または偽物で実行することです。 fakechroot を呼び出すと、rootでなくても偽のchroot環境を作成できます。空のディレクトリから開始して、データを入力する方法は次のとおりです。
mkdir -p bin etc tmp var/spool/cron/crontabs
echo "temp:x:$(id -u):65534:Temporary user:/:/none" >etc/password
touch var/spool/cron/crontabs
cp /usr/bin/crontab /bin/sh /bin/sleep /bin/cat bin/
cat "${cron_tab}" >input
echo n | env -i EDITOR='sleep 1; cat /input >' fakechroot -d /lib/ld-linux.so.2 -- chroot . /bin/crontab -e
システムに応じて、実行可能ファイルの場所を微調整します。 /lib/ld-linux.so.2
はダイナミックローダーです。 Linux on x86_32の場所を指定し、Linux onx86_64の場合は/lib64/ld-linux-x86-64.so.2
を使用します。ldd /bin/cat
を実行し、単一の絶対パスが指定されている場所をメモすると、場所を見つけることができます。
Crontabが有効な場合、最後のコマンドは0を返します(var/spool/cron/crontabs/temp
も変更します)。 crontabが無効な場合は、エラーステータスを返し、エラーメッセージを出力します。
sleep 1
は、crontab
がファイルが変更されていないと見なさないようにします(一部の実装は変更時間をチェックし、一部のファイルシステムはファイルのタイムスタンプに対して1秒の粒度しかありません)。遅延を回避するには、touch
の代わりにsleep
ユーティリティをコピーし、設定してタイムスタンプを変更するように調整できます(GNU touch
)
EDITOR='f () { cat /input >"$1"; touch -d "+ 1 second" }; f'