2007-01-23

cron, crontab, and more

※ タイトルには意味ないです。

Unix の伝統的なツールで、かつ GNU のツールが(普及|台頭)していないものには意外と細かいバージョンの違いがある。cron もその一つ。

自分で見て試した限りでは以下のような違いがあった。

FreeBSD/etc/cron.d/* を読まない
Linuxcron -j でジョブの実行を数秒分散させるってことはできない?

実行時間の分散についてはランダムにずらすよりは fcron や uschedule の方が賢いのでそんなに気にする必要はないだろうけど、FreeBSD の「設定ファイルを分けることができない」っていうのは、設定するものが増えてくると面倒なような気がしないでもない1

で、それとは別に cron て意外と不便だなと思うのは

  1. 秒単位の指定はできない
    • やるとしたらプログラムを指定秒 sleep してから動くようにセットする
  2. 「第2月曜」という指定はできない
    • やるとしたら月曜日に実行を予約して、立ち上げたプログラムの方で第2に当たるかどうかをチェックしないといけない

辺り。この辺は Windows のタスクスケジューラの方がよくできている。2

特に 2 のような要求はビジネスでスケジューリングしたいときには結構出てくると思う。毎月の最終営業日が終業したタイミングでバッチ処理を走らせる、なんてのはいかにもありそうだ3。その辺考えると伝統的な cron に代わるスケジューラってあってもよさそう。ということでもう一度調べたらこんなものを見つけた。

  • Mcron - GNU Project - Free Software Foundation (FSF)
    • Guile で書く
  • Fcron : a periodical command scheduler for Unix and Linux systems
    • load average とか気にしてくれます。ほとんど cron 互換と言っても差し支えないような?
    • 24時間動いてなくてもいいらしい。その機能は結構嬉しい。開発用クライアントマシンで daemon のログがものすごいことになったりするのをうまく解決できるかも。あんまり細かく見てないけど。
  • uschedule
    • もうちょっと細かい指定ができるんだけど、互換性もなくなってきてるし、なんでこんなにいっぱい分かれてるんだろ?

load average を見て実行を遅らせるとか、やっぱシステム寄りの見方が中心なのかなぁという感じがする。

OSX は launchd で iCal との連携も強化してるっぽいけど、ぱっと見た感じ XML を使うみたいで、直書きのことは考慮してないかなぁ? まぁ人間に都合のいい細かい情報って、逆に機械に読みやすい形式で書式を決めていくのが面倒なケースも多いのでしょうがないのかもしんない。

つーことで結局のところ mcron のようなアプローチで、自分の書きやすい言語で日時などの条件をチェックしてから目的のプログラムを動かす、っていう流れにしちゃうのがいちばんいいのかもしんない。一瞬、YAML で設定ファイルを〜とか思ったけど、そういうことはしない方がたぶんいい。その方法で簡単に記述できるような条件なら、妥協も組み合わせて既存の crontab のフォーマットで再現すべきだろう。

ブツは cron ジョブに複雑な条件を与えやすくする の方に載せました。

  1. 分かれてる方が面倒なケースもあるし、一概には言えないけど。 

  2. タスクスケジューラが設定一覧をファイルに簡単に吐き出せるとか、逆にファイルからサクっと設定を読み込めるとか、そういうことができれば使いやすいのになぁ。 

  3. この場合は日付でも指定できないし、曜日でも指定できない。毎月1日の前日の夜、という指定で置き換えるなら条件的にはもう少し楽になるけど。 

About

例によって個人のなんちゃらです

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm