web-dev-qa-db-ja.com

crontab検証の正規表現

Crontabファイルへのエントリが有効かどうかをbashでチェックインする必要があります。 crontabコマンドスイッチはありますか?

個々の行を抽出し、正規表現を使用して個々のアイテムを制御しようと試みることはできますが、レコードのタイプを確認する方法がわかりません。 10,20,30*/2Jan-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
    ...
4
Vsw

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'