Func: Fedora Unified Network Controller を使ってみた(6.1)

Func用のスケジューラとして、JobScheduler を試してみたのだが、今ひとつ思い通りに動いてくれなかったので、別のスケジューラを探してみようと思う。

スケジューラ用に、cronを拡張としたツールとしては、fcron (http://fcron.free.fr/ ) などいくつかあったのだが、
1. 実行する時刻だけでなく、実行しない時刻(休日対応など)がある
2. 別のファイルから、実行しない時刻を取りこめる
などの条件を満たす機能はないようだ。。

個人的には、cronを拡張して、

command='/bin/ls >> /tmp/aaa'
 - * * 22,23 9 *
 + 0 7 * * *

("毎朝7時に/bin/ls を実施するが、 9/22, 9/23には実施しない") などの設定ができるcronの拡張が欲しい。。 (最初の1桁が - なら、実施しない条件、 +なら実施する条件、上から順に当てていって最初に当たった条件を適用する )

ただ、単純なルールであっても、こういった字句解析を含むスクリプトを作るのは、割に合わない作業のことが多いのだ。。(22,23 や 22-24 などよく使う書き方を取り入れようとすると特に)

微妙だが、いっそのことcrontab自体をPython等のスクリプトにして、/etc/cron.d/ 以下に root/__init__.py, ipauser1/__init__.py などを作り、各スクリプトをimport するような常駐プロセスがあると、柔軟なスケジューリングができそうだ。。 作成するcrontab に対応するファイルは次のようになる。

(root/row2.py) <== root/__init__.py から取り込む
command='/bin/ls'
def check_min(n):
  if (n == 7):
    return True
  else:
    return False
def check_hour(n):
  if (n == 0):
    return True
  else:
    return False
def check_day(n):
  return True
def check_month(n):
  return True
def check_dow(n):
  return True

(実施しない条件の場合には、command をNoneにするなど調整する ) 更に、 check_year まで含めるようにすると、1年毎の更新漏れなどもなくなるため、いろいろと便利かもしれない。。


ちなみに1行目の"実行しない日"については、 /etc/cron.d/_holidays/september.py など、個別に作成する。

(september.py)
command=None
def check_min(n):
  return True
def check_hour(n):
    return True
def check_day(n):
  if (n == 22 or n == 23):
    return True
  else:
    return False
def check_month(n):
  if (n == 9):
    return True
  else:
    return False
def check_dow(n):
  return True