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
...
答え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.2
x86_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'