ロケットネットでスケジュールタスク(crontab)を設定する

Read More

ロケットネットのサーバでcron機能を利用する方法。


cron機能とは、crontabファイルのデータを元に、決められた時間間隔で定期的に指定ファイルの実行をしてくれるデーモン(windowsでいうサービス)プログラムのこと。


そのcron機能だがロケットネットではcrontabの直接編集ができない
その代わりスケジュールタスク機能というものが管理画面(操縦席と呼ばれる)にて提供されている。

このスケジュールタスク機能を利用してcrontabファイルの一部を編集・更新していくという形となる。

管理画面のスケジュールタスク機能のSS


■総括
細かい説明に入る前に先に総括。
cron設定時の注意点は大きく3つ。
・日時の指定を間違えない
・コマンドの指定を間違えない
・ファイル、或いはフォルダのパーミッションを正しく設定する



以下説明。



管理画面のスケジュールタスクの入力項目には、
・分
・時
・日
・月
・曜日
・コマンド
とある。

まず分~曜日に実行タイミングとなる値を設定する。

設定できる値は以下の通り。
+-----------------------------------------------------------+
分         |0~59
時         |0~23
日         |1~31
月         |1~12
曜日       |0~6 (0が日曜日となる)
+-----------------------------------------------------------+

基本的に指定していないフィールドには*(アスタリスク)を指定する。
ただし分フィールドに*を指定すると毎分実行されるので注意。
# 分フィールドに0-59の指定も同様の結果となる。
例えば以下ののものは1:00から 1:59まで 1分おきに実行される。
ex)
分に*、時に1、日に*、月に*、曜日に*
あるいは、
分に0-59、時に1、日に*、月に*、曜日に*


他、以下のような表記が可能となっている。


・カンマで区切る
これにより実行するタイミングを複数設定することができる。
例えば分フィールドに、
0,15,30,45
と設定すると毎時「0,15,30,45分」に実行される。

・ハイフンで区切る
これにより実行期間を指定できる。
例えば曜日フィールドに、
1-5
と設定すると月曜日~金曜日にのみ実行される。

・スラッシュで区切る
これにより実行間隔を設けることができる。
例えば時間フィールドに、
1-5/2
と設定すると1時、3時、5時にのみ実行される。 
*/2
と設定すると、24時間の中で2時間区切りで実行される。
なおカンマ、ハイフン、スラッシュは同時に設定することができるので細かい設定が可能となってくる。


スケジュールタスクが1時間に1回の実行でよいのならば、
時フィールドに「*/1」を設定し、分フィールドに「0」、残りのフィールド(コマンドフィールドを除く) に「*」を設定すればよい。


参考までにいくつかの例を残しておく。
ただしこの表記は管理画面のスケジュールタスク機能からのものと違い本当のcrontabの書き方となっていることに注意。
43 23 * * *               23:43に実行
12 05 * * *             05:12に実行
0 17 * * *                17:00に実行
0 17 * * 1                毎週月曜の 17:00に実行
0,10 17 * * 0,2,3         毎週日,火,水曜の 17:00と 17:10に実行
0-10 17 1 * *             毎月 1日の 17:00から17:10まで 1分毎に実行
0 0 1,15 * 1              毎月 1日と 15日と 月曜日の 0:00に実行
42 4 1 * *              毎月 1日の 4:42分に実行
0 21 * * 1-6            月曜日から土曜まで 21:00に実行
0,10,20,30,40,50 * * * * 10分おきに実行
*/10 * * * *        10分おきに実行
* 1 * * *         1:00から 1:59まで 1分おきに実行
0 1 * * *         1:00に実行
0 */1 * * *        毎時 0分に 1時間おきに実行
0 * * * *         毎時 0分に 1時間おきに実行
2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02に実行
30 5 1,15 * *       1日と 15日の 5:30に実行





次にコマンド。


ロケットネットのマニュアルには、
例)/var/www/vhosts/example.com/httpdocs/path/to/command/hoge.php
もしくは、
/usr/bin/php /var/www/vhosts/example.com/httpdocs/path/to/command/hoge.php
と設定の例が書いてあるがこれでは動かない(正確には動かないことが多い)。

特に前者は環境変数が通っていない場合phpはまったく動かない。
後者においては動くには動くのだが、include()やrequire()などといったものに絶対パスを指定するようにしなくてはならなくなる。

絶対パスで指定してない場合、同じ実行ファイルに対してwebアクセスでは動くのにコマンドアクセスで動かないというようなことが起こる。
# 他サイトでは絶対パスでないと動かないなどの記述も存在する

このような挙動の差がでるのは、webアクセス時とコマンドアクセス時のカレントディレクトリの違いによる。


webアクセスはアクセスした位置がカレントディレクトリになるのに対して、
コマンドアクセスはアクセスした位置に関わらずカレントディレクトリはルートになる。

このため絶対パスを指定しないと挙動に違いがでるというわけ。


しかし常に実行ファイル内のパスを絶対パスで指定するとなると何かと不便なことが多い。
絶対パスでなく相対パスのままでいく方法はないものか…


これには2通りの方法がある。



一つは、コマンドでカレントディレクトリの場所を変更した後に実行させるというもの。

具体的には以下のようになる。
cd /var/www/vhosts/{xxxxx}/httpdocs/command/; /usr/bin/php example.php

{xxxxx}の部分はドメイン名が入る。
最初にcdコマンドでcommandフォルダに移動しているのだ。

こうすることによりcommandフォルダが実行時のカレントディレクトリとなる。
ディレクトリまでのパスがよく分からない場合はphpinfo()でDOCUMENT_ROOTの値を調べればよい。

コマンドの注意点としては半角空白を忘れないことくらいか。


あと必ずしも実行させるファイルの位置に移動しなければならないというわけではない。
例えば、実行ファイルと別の場所にカレントディレクトリを設置したい場合はこんな設定も可能。
cd /var/www/vhosts/{xxxxx}/httpdocs/; /usr/bin/php /var/www/vhosts/{xxxxx}/httpdocs/command/example.php




もう一つの方法は実行ファイル内でchdir()を使ってカレントディレクトリを指定する方法。

実行ファイルの先頭行に、
chdir(dirname(__FILE__));

と記述すればよい。

そうするとその位置がカレントディレクトリとなるのでそれ以降は相対パスで書いていても動く。

こちらの方がぱっと見お手軽ではある。
ただしカレントディレクトリの変更というのはそう何度もやらない方がよい。

例えばある実行ファイル内の先頭でchdir()をしていたとする。
その後そのファイル内でinclude()をしていて、include先のファイルでもカレントディレクトリを変更されたりしていると段々とわけがわからなくなる。
# 経験則

それならばまだ実行ファイルの呼び出しコマンド側でcdで移動しておいてくれた方が後からみてわかりやすいといえばわかりやすい。

まあこの辺は好み。



最後に実行ファイルの権限(パーミッション)について。


実行ファイルの実行権限は644(デフォルト)のままではダメ。
最低でもオーナーの実行権限は必要。
まあ755でいいんじゃないかと思う。




とりあえずこれでcronが動くことは確認できた。

なお高負荷がかかるプログラムを短いスパンで実行しているとサービスを停止されることがあるので(当たり前だけど)気をつけること。




--
おまけ。


最初ロケットネットでスケジュールタスクの設定をしたとき、実行ファイルに正しくコマンドアクセスができているのかどうか判断できなかった。

通常ならばcronログ(/var/log/cron)というので確認することができるのだが、ロケットネットの場合ファイルにアクセス権限がないので確認することができない。
実行ファイルそのものにアクセスできていない場合、accessログやerrorログにも残らない。

ってことで一番最初にやったのが、
実行ファイルにアクセスしら自前でログを吐くってプログラム。

■access.php
<?php
chdir(dirname(__FILE__));
$path = dirname(__FILE__).'/system.log';
error_log('access!', 3, $path);
?>

これをスケジュールタスクで実行させた。

とにかく、まずコマンドアクセスできているのか知りたかった。

実行ファイルにアクセスすると同階層のフォルダ内にログファイルが生成されるのでaccess.phpが置いてあるフォルダのパーミッションを777に設定しておく必要がある。
あるいは空のログファイルを用意しておいてそのパーミッションを777にしておくとか。

どちらにしろあとで戻すのを忘れないように。





Comments(3)

1  びるぱん  2013/06/27 (木) 05:05 ID:N4gmFo115
ロケットネットってレン鯖として良い感じ?コスパとか安定性とか、転送量とかプログラム環境とか(cronは今回分かった。)

返事もらえると幸い。
適当なレン鯖を探しているのです。。。

2  シラサヤ  2013/06/27 (木) 10:11 ID:IThuKay15
レンタルサーバ決めるのって苦労するよね。
有名どころのは大体見てきたつもりだけど、
ロケットネットのコスパはかなりイイほうだと思うよ。
もちろんこれは国内に限っての話だけど。

■ロケットネットのサービス詳細ページ
http://rocketnet.jp/shared/function.html


サーバは共有だから安定性に関しては運の要素もあるかも。
俺のはまったく問題ないけど。
# 問題があったって書き込みはみたことはある

ま、初年度1000円/年だから試しに使ってみるのも悪くない。
# 次年度以降は6300円/年(つまり525円/月)
# トライアル10日ってのもあるみたい


転送量は無制限うたってるね。
まあ限界値ってのはこっそりあるんだろうけど。
でもまあサイトを複数扱っててFTPやDLもそれなりに量あるけど制限がかかったようことは一度もないな。
速度に関しても問題ないかな。
ただ一時重い時期はあった。今は改善されてるけど。
あとPHPのVerUPでスタッフが設定ミスってページが表示されなくなったこともある。

ディスク容量が50GBってのはすごいと思う。


スクリプト環境については個人の求めるものによると思う。
俺はPHPだからVer5とか.htaccessの利用ができれば良かった。


■個人的に特に気に入ってるとこ
・マルチドメイン無制限
・サブドメイン無制限
・SQLite利用可
・.htaccess利用可
・PHPはCGIとApacheモジュールの選択可
・ディスク容量

■不満なとこ(気をつけたいとこ)
・管理画面がやや使いにくい
・Postgresが使えない
・MySQLは3つまで
・SSHはNG
・アダルティなものはNG
・専用サーバがない
・独自SSLがない
・サポートがメールのみ


こんなとこ?
参考になればいいけど





3  びるぱん  2013/07/01 (月) 12:19 ID:rzndNzi15
なるほど、次年度以降のこと考えて無かったな。ちょうど手頃な鯖ってなかなか難しいよねぇ…

試してみても良いかなぁと。まだサイト書き上げてないけど…