NASでcron♪
2017年9月23日19:00 公開
当初は常識的に?レンタルサーバー上でクーロン実行考えていたですが。
良く良く考えてみれば。
私が今クーロンで実行させたいと思っているスクリプトは、レンタルサーバーで実行する必要全然ない、んですよねー。
要はping出来れば良い、と。
でもって、NAS上で(ブラウザ通しての)プログラムはちゃんと動いているし。
基本、記事作成は、ローカル(NAS)で実行してるという運用。
で、ping(トラックバック)待ちデータを作成するタイミングは、記事作成時で、実際にping実行するのが、cronチェックして記事公開時間後、というのを想定してまして。
ローカルでの記事作成時に登録する情報は、作成する記事URLを含め、全てグローバルな情報なのでそのまま変更ナシで使える訳で。
なんかレンタルサーバーで何かあると嫌なので、NASでの運用一本に絞ろうと今のところは思ってます。
(他にcronでの実行考えているのは今は無いので)
で、肝心のNASなのですが。
最初はcron登録?と思って調べてましたが、単純に、NASのコントロールパネルに「タスクスケジューラ」なるものが存在していました。
そうこのタスクスケジューラで、実行させたいshを指定して、実行スケジュール登録すればOKという。
なんとお手軽なv
ちょっとphpの実行パスで悩みましたが。
これもsshで入って単純に探せばすぐ出てくる話。全く無問題です。
無論、タスクスケジューラでテスト実行も出来るのです。
で、このテスト実行で成功したので、良い気になっていたら。実際にタスクスケジューラで動いたらエラーが出てしまって。
何でだろうと考えてみたら、テスト実行時も結局、ブラウザからの実行なんですよね。
で、動かそうと思っているプログラム内では、最初にサーバー名をサーバー変数から取得してレンタルサーバーかどうかというのをチェックしていたりするんです。
ここでたぶん引っかかって、というよりブラウザ実行ではないから、基準となる値を取得出来ず、レンタルサーバーと判断されて、レンタルサーバー用のシステムディレクトリやDBが入っているディレクトリを設定して処理しているのではないか、と推測しました。
これを回避するには、サーバー名が空白の時には問答無用でローカル(NAS)判定、またはコマンドライン実行時はローカル判定とするしかないでしょう。うむ。
ということで対応しました★
(いいのか、本当にこれで。。。)
タスクスケジューラで実行させる cronjob.sh # /usr/local/bin/php70 は NAS(Synology) php7 パス # /volume1/web/hogehoge/you/index.php は codeIgniter 実行ファイル(htdocsに置く) # cronjob は CodeIgniter の 実行させたいクラス: controller(index.phpで呼び出すapplication ディレクトリ内) # tb_send は Cronjob.php 内の 実行させたいメソッド /usr/local/bin/php70 /volume1/web/hogehoge/you/index.php cronjob tb_send
コマンドラインからの実行かどうかを判断する // config/routes.php や、controller で必要に応じて if (php_sapi_name()=='cli' || PHP_SAPI === 'cli') { // コマンドライン実行の場合の処理 // こんな風に、echoしておくと、タスクスケジューラで指定したログに出力される if ($result_success) {echo 'success cronjob : ' . date("Y/m/d H:i:s", time());} exit; } else { // 通常の処理 }
あと、NASの管理者画面について。
最初、「基本モード」だったので、コントローラパネルにタスクスケジューラ自体が表示されていなかったんですよね。
(「上級者モード」にしないと出てこないメニューが結構ありました)
ここだけ、単純なだけにひっかかる所かも。って私だけですか。。。
メニューページ
メインコンテンツ
タグ別
公開日別
Popular Entries
Recent Comments
Information
Recent Update
Preview
Information(Board)