odeの開発メモ日記

プログラマーやってます。今までの道のり ポケコンbasic→C(DirectX5 ネットやろうぜ)→Perl(ちょろっと)→Java→C#→Ruby→Android(Java)

cronで秒単位でアプリを起動させたい。

ご存知の通りcronでは一番短い単位で1分ごとにしかアプリを実行できない。

というわけで秒単位で起動できないかをググったら
30秒おきに稼動させたいならこうするらしい。

* * * * * myapp & sleep 30; myapp

けどこれだと5秒おきとかはcronの設定が大変なことに、、ましてや1秒おきの場合なんて、、


というわけで人生初のシェルスクリプトを書いてみました。
とてつもなくへっぽこなのは堪忍してくださいまし。
Rubyistを目指してるものとしてはわざわざシェルスクリプト勉強せずにrubyで書けばよかったと思うが、rubyを入れてない環境でも使えるのでちょこっと便利?)

スクリプト

myappという実行ファイルがある場合
同一フォルダに下記のスクリプトを用意する

最初のほうにある変数exeとsecondを適当に書き換えて使って下さい。


myapp_cron_second.sh

#!/bin/sh

# 起動させるアプリファイル
exe="`dirname $0`/myapp"

# 起動間隔(秒)
second=5


loopMaxCount=`expr 60 / $second - 1`
count=1
while [ $count -le $loopMaxCount ];
do
        echo "$count"
        if [ $count != $loopMaxCount ]
        then
                $exe & sleep $second;
        else
                $exe
        fi
        count=`expr $count + 1`
done

cronには下記で登録

* * * * * /usr/local/myapp_cron_second.sh
2重起動

なお、秒単位のアプリ稼動だと2重起動してしまう可能性が高くなります。
もしアプリの性質上2重起動がNGの場合は
下記URLの方の2重起動防止スクリプトが使えそうです。
http://d.hatena.ne.jp/zenpou/20080715/1216133151

備考

ちなみに秒単位起動を実現するのにcronexecというアプリがスマートそうなんですが
安定度もわからないのとメンテナンスされてなさそうなのでやめときました。

更新履歴
  • 2012/1/23 はてブコメントでa1102012さんからcrontabの*の数が違う指摘があったのを修正。