crontab検証のための正規表現

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
    ...

ベストアンサー1

crontab行が有効であることをテストする最も信頼できる方法は、crontabユーティリティに問い合わせることです。

ほとんどのcrontabユーティリティには、crontabを変更せずに確認するだけのオプションはありません。 setup crontabを呼び出しcrontab -eて成功すると、以前の内容を復元できますが、これは信頼できません。入力が有効な場合、時計は復元前にわずか1分経過し、ここに含まれている操作が開始される可能性があります。前述したように、他の人が同時にcrontabを変更すると、タスクの一方または両方が中断されます。

だからあなたができることはcrontabそれを自分の遊び場と呼ぶことです。これを行う1つの方法は次のとおりです。chroot- 真実または偽。電話してもいい近さルートの代わりに偽の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動的ローダーです。 x86_32のLinuxの場所、/lib64/ld-linux-x86-64.so.2x86_64のLinuxの場所などを提供します。ldd /bin/cat指定された単一の絶対パスを実行して記録して、場所を見つけることができます。

crontabが有効な場合(また修正var/spool/cron/crontabs/temp)、最後のコマンドは0を返します。 crontab が無効な場合はエラー状態を返し、エラーメッセージを出力します。

sleep 1ファイルが変更されていないと見なされないことを確認してくださいcrontab(一部の実装では変更時間を確認し、一部のファイルシステムには1秒単位のファイルタイムスタンプがあります)。遅延を回避するには、touch代わりにユーティリティをコピーしsleepて設定でタイムスタンプを変更するようにスケジュールできます(GNUがある場合touch)。

EDITOR='f () { cat /input >"$1"; touch -d "+ 1 second" }; f'

おすすめ記事