こんにちは!
ナビゲータのEVEです。
政界は、久しぶりに騒がしいようですが、私は、自宅でくつろいでいました。ちょっと、1つ作業はしましたが、もうこんな時間になったので、残りはまったりとしたいと思います。
では、昨日の続きです。
[PHPプログラムでクーロンタブを実行する]
昨日話した内容がよく分からない人もいるかもしれないので、PHPというプログラムで、クーロンタブを実行する方法について最初から話したいと思います。大まかな流れとしては、以下の様になります。
@クーロンタブコントロールファイルを作成する
Aクーロンタブコントロールファイルをクーロンタブへ反映する
Bクーロンタブコントロールファイルの内容を確認する
C/etc/sudoersを編集する
では、@から順番に、解説しましょう!
[@クーロンタブコントロールファイルを作成する]
作業としては、以下の流れで作成します。
1)MySQLから実行予定のプログラムとその時刻等を取得し編集します。。
※これは、別画面を作成し、登録した内容をMySQLで取得し編集しています。
2)クーロンタブコントロールファイルを作成します。以下の様な感じのファイルを作成します。
1.SHELL=/bin/bash
2.PATH=/sbin:/bin:/usr/sbin:/usr/bin:
3.MAILTO=user@mail.jp
4.HOME=/var/www/html/batch
5.00 4 * * * bash batch.sh
1.は特に異なるシェルを必要とする場合や、環境によってデフォルトのシェルが異なる場合に指定します。
2.Cronジョブ内で実行されるスクリプトやコマンドが必要なプログラムやコマンドのパスを指定します。
3.クーロンタブの実行結果などを送信するメールアドレスを指定します。
4.バッチ処理を実行するホームディレクトリを指定します。
5.以降は、MySQLから取得した内容に基づき編集する部分になります。
[今回の実装]
今回の環境用に作ったコントロールファイルでは、1.2.3.は、Prototype EVEの環境同様に指定していますが、4.は指定していません。理由は、Prototype EVE、New Prototype EVE、そしてEVEシステムでそれぞれ実行するので、ホームを必要としないからです。ただ、4.のHOMEを指定した場合でも、実行するプログラムの絶対パスを指定することにより、4.のHOMEの影響を受けることなく実行できます。
1.SHELL=/bin/bash
2.PATH=/sbin:/bin:/usr/sbin:/usr/bin:
3.MAILTO=user@mail.jp
4.HOME=/var/www/html/EVE/batch
以降の記述が5.に相当します
00 4 * * * exePhp /var/www/html/EVE/batch/batch.php
00 5 * * * bash /var/www/html/PrototypeEVE/batch/batch.sh
00 6 * * * php /var/www/html/NewPrototypeEVE/batch/batch.php
[今回の問題点 〜Aクーロンタブコントロールファイルをクーロンタブへ反映する〜]
今回の問題点は、実行権でした。以前は、管理者ユーザーrootに実行してもらっていました。当然、実行できるプログラムを限定した上、クーロンタブがプログラムから実行された場合、管理者にメールを通知するということをしています。それをセキュリティとしていました。
/usr/bin/sudo -u root /usr/bin/crontab crontabContolPath+File
ただ、今回は、root権限でプログラムから実行しようとしても、system関数、exec関数ともエラーになります。そのため、ChatGPTにエラーメッセージと、クーロンタブコントロールファイル、そして、実行するプログラムを見せて、どうしてこんなエラーになるのか問い合わせたところ、rootで実行するのはセキュリティ的に悪いので、ユーザーを作成し、作成したユーザーで実行することを勧められました。問い合わせた内容からすると的外れのような気もしたのですが、その通りにやりました。ただ、やはり、system関数、exec関数においてエラーになります。
次にやったのは、Apacheをユーザーとして実行する方法です。PHPを実行するのは、実質的にApacheです。それを考えれば、そういう考えに至るのは当然の流れです。
/usr/bin/sudo -u www-data /usr/bin/crontab crontabContolPath+File
Ubuntuの場合、Apacheのユーザーはwww-dataなので、www-dataで実行して見ると、system関数、exec関数で実行してもエラーになりません。ただ、その登録した結果を見ることができません。なぜかというと、www-dataで再ログインできないのです。それは、Ubuntu側で制限をかけているのです。だから、関数の方で正常と言っているが、まだ、うまくいっていないのだと思い込み、引き続き調査をしていました。・・・・が、実はここでうまくいっていたのです。今から考えると本当に無駄な時間を過ごしました。ちなみに、www-dataに設定したクーロンタブは、以下のコマンドで確認できます。
[Bクーロンタブコントロールファイルの内容を確認する]
# sudo crontab -u www-data -l
ただ、今このブログを書いている現在、ChatGPTに聞いたところ、Ubuntuでもwww-dataでシステムへログインする手段はあるようです。ログインすることにより、問題がある場合もあるそうなので、それについては、別途機会があったら、調べるとして、もし、設定した値を見たい場合は、以上のコマンドから見ましょう!
[C/etc/sudoersを編集する]
PHPプログラムから、system関数またはexec関数で実行する場合、sudoツールを利用しなければなりません。直接OSコマンドを実行しようとしてもFedraではうまくいきませんでした。よく考えたら、Ubuntuでは試していませんでしたが、セキュリティが高くなったUbuntuでは、多分できないでしょう? 修正内容としては、今回は以下のように修正し、うまくいっています。
www-data ALL=(root) NOPASSWD : /usr/bin/crontab
セキュリティについては、本番環境構築までに考えたいと思います。
[あとがき]
先週末の状況をまとめていて思うのですが、結果として、前回同様にかなり無駄な時間を過ごしているような気がします。このような調査をする場合の手順を予め作った方が良さそうです。まず、どうしたら最短で結果を得られるのか論理的に考えるのです。今後は、このような難題は出てこないとは思うのですが・・・。
なお、以上の内容でシステムを構築していきますが、今回の目的から可能とする方法は多分ですが、以上の方法だけです。ようは、Apache+PHPの組合せで、crontabを実行する場合は、www-dataで実行しなくてはいけないと言うことです。なぜかというと、そう断言できるぐらいいろいろな方法をためし、system関数またはexec関数がエラーにならなかったのは、www-dataだけだったからです。
以上で、PHPからクーロンタブが実行できるようになりました。これにより、今週末から、Yahooクローニング処理の製造にはいれます。
流れとしては、以前お話ししたとおり、以前作ったプログラムから必要な関数の一覧を作り、その一覧に基づきClassを作っていきます。まだ、調べていないので、どのくらいかかるのか不明ですが、できるだけ、近日中に製造を完了したいと思っています。
では、また!!!
【このカテゴリーの最新記事】