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