シェルスクリプトでPHPを実行する方法と問題解決方法

このQ&Aのポイント
  • シェルスクリプトでPHPを実行する方法についての問題を解決したいです。
  • 設定ファイルやcronのログを確認し、問題がないことを確認しましたが、なぜ実行されないのか分かりません。
  • 直接ブラウザから起動すると正しく処理されるので、シェルスクリプトの設定に問題がある可能性があります。
回答を見る
  • ベストアンサー

シェルスクリプトでPHPを実行したい

シェルスクリプトでPHPを実行したいのですが、うまくできません。 centos5でcrontabに 20 0 * * * /bin/sh /var/www/html/test/test.sh と登録しています。 cronのlogをみたところ Dec 12 00:20:01 localhost crond[19060]: (root) CMD (/bin/sh /var/www/html/test/test.sh) と記録されていてここまでは問題ないように思えます。 test.shの中身は #!/bin/sh cd /var/www/html/test/ php -f daily.php > result exit になっています。 daily.phpが実行されないので、daily.phpに何かおかしなところがあるのかと思い daily.phpを直接ブラウザから起動してみたところ問題なく処理されました。 このような経緯でtest.shの中身が間違っていると思っているのですがどこが間違っているのか分かりません。 どなたかアドバイス頂けると助かります。

  • ospsp
  • お礼率69% (16/23)

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

cronで実行したときって、環境変数のほとんどが未定義状態、PATHも最低限になります。 それが影響してるのでは? phpのあるディレクリはどこですか? /usr/local/bin とかだと、ほぼ確実にPATHが通ってないと思います エラーなどの出力があったらメールでその内容が届くはずですが、届いていませんか? 届いていたら、エラーメッセージ等が入ってないでしょうか?

ospsp
質問者

お礼

パスを確認して動作を確認できました。 どうもありがとうございました。

ospsp
質問者

補足

phpのあるディレクリを確認するにはどのようにしたらよいでしょうか。 また、エラーメッセージの確認方法も分かりません・・・ 申し訳ありません。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

パス, 通ってます?

ospsp
質問者

お礼

パスを確認して動作を確認できました。 どうもありがとうございました。

ospsp
質問者

補足

phpのパスはどのようにしたら確認できるのでしょうか?

関連するQ&A

  • crontab -e コマンドで編集してもCronが動作しません。

    testユーザーで手動でコマンド実行すると正常に動作するのですが、 crontab -eで、下記のようにCronを登録しても動作しません。。 00 12 * * * /var/www/html/bin/cron.sh args1 /var/log/cronを見ても Jun 19 12:00:01 web1 crond[3095]: (test) RELOAD (cron/test) というように、RELOAD となりまりコマンドが実行してくれません。。 Jun 19 13:01:01 web1 crond[9116]: (root) CMD (run-parts /etc/cron.hourly) というように、CMDが出ているのですが。。

  • さくらVPS cronでphp

    centos6 さくらVPS cronでphpを実行したいのですが、うまくいきません? vi /etc/crontab    ↓ 44 * * * * /var/www/html/oms-main2/end.php ちなみにend.phpは、手動では動きます。 cronlog  ↓ Apr 15 10:44:01 www32258ue CROND[6787]: (root) CMD (/var/www/html/oms-main2/cron.php) 宜しくご教授お願い致します。

  • crontabでのシェル自動実行がNG

    いつも参考にさせてもらっています。 linux(Red Hat Enterprise Linux ES release 3 Apache/2.0.46)上でcrontabを設定したいのですが、 現在うまくいっておりません。 まず、autoindex.shというシェルを/home/foo/scripts/ディレクトレィに作成しました。中身は3行からなっていて #!/bin/sh cd /var/www/html/search/index mknmz -a /var/www/html/test です。telnet上でroot権限を使用し、./autoindex.shコマンド発行で正常に動作しました。 そこで、crontabに以下のように # crontab -l 50 11 * * * root /home/foo/scripts/autoindex.sh と設定したところ、 # more /etc/log/cron Sep 27 11:50:01 intra crond[18280]: (root) CMD (root /home/foo/scripts/autoindex.sh ) とcronは決めていた時間(11時50分)に稼動しているようなんですが、mailを見ると # mail -t From root@XXX.com Wed Sep 27 11:50:01 2006 Date: Wed, 27 Sep 2006 11:50:01 +0900 From: root@XXX.com (Cron Daemon) To: root@XXX.com Subject: Cron <root@hoge> root /home/foo/scripts/autoindex.sh X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <HOME=/root> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=root> X-Cron-Env: <USER=root> /bin/sh: line 1: root: command not found と、シェルがこけているようです。 何か解決のヒントがありましたら、ぜひ教えていただけないでしょうか。

  • さくらVPSでcronでphpを実行

    さくらVPSでcronでphpを実行したいのですが、うまくいきません? vi /etc/crontab    ↓ 30 * * * * root /usr/bin/php/var/www/html/oms-main2/end.php 実行できないので /etc/rc.d/init.d/crond status → crond (pid 2559) を実行中 ちなみにend.phpは、手動では動きます。 宜しくご教授お願い致します。

  • cronが実行されない

    環境:Vine Linux 2.6CR 現在、毎朝4時に、自分で作成したシェルをcrontabで登録して実行させているのですが、cronが動いてくれません。 psで、crondの実行は確認できています。 それと、cronの登録方法は、crontab -eで登録し、シェルは、/etc/cron.dailyに格納しています。 パスも登録しているのですが、実行してくれません。 どこがおかしいのでしょうか? アドバイスをお願いいたします。

  • PHPファイルをcronで定期的に実行したい

    centosでtest.phpを30分おきに動作させようと思います。 test.phpは /var/www/html/においてあります。 test.phpはコードの中で、require_once 'phpkit/kits.inc';と /var/www/html/phpkit/kits.incを呼び出しています。 [root]# find / -name php /root/src/senna-1.1.4/bindings/php /usr/share/swig/1.3.40/php /usr/share/php /usr/bin/php /usr/include/php /usr/lib64/php /var/lib/php [root]# /etc/rc.d/init.d/crond status crond (pid 1181) is running... [root]$ crontab -e 30 * * * * /usr/bin/php /var/www/html/test.php しかし、以上のように設定してもtest.phpは一度も実行されません。 phpのインストールは、ここの「PHPをソースからインストール」を利用しました。 http://www.akiyan.com/blog/archives/2008/09/tritonnmysqlsen.html /var/www/html/にinfo.phpを置いてアクセスしたところ、正常に情報が表示されます。 /var/www/html/にtest.phpを置いて、手動でアクセスしたところ、test.phpは正常に動作します。 ですので恐らくcrontabの設定が間違っているのだと思いますが、これ以上どうすればいいのかがわかりません。 cronでtest.phpを動作させるのに、この後どうすればいいのでしょうか。 どなたかご教示のほど、どうかよろしくお願いします。

  • シェルコマンドでphpを実行したい!

     さくらインターネットでcron設定を使って月末になると起動するphpを読み込もうとしたいのですが、どうやっても上手くいきません。 いろいろと参考になるサイトはあるのですが、動かない理由がわからないのでどなたか教えてください。  まず、cron設定で設定しているシェルのファイルが置いてあるパスに間違いはありません。  次にシェルファイルに書いてあるコードは以下です。 #!/bin/sh PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin cd /home/自分のID/www/自分で作ったフォルダ/; ./自分で作ったフォルダ/phpファイル という風に書いてあります。 ところが、時間になるとこれが実行されず、 サーバーよりエラーメールが届きます。 [not found]と一言。 …最初、シェルファイルの階層が間違っているかと思ったのですが、 どう見てもあってますし…中身が問題なのかなぁ、と考えます。 何かわかれば、是非教えてください。 お願いします。

    • ベストアンサー
    • PHP
  • シェルスクリプトで複数実行するには?

    web上からもアクセスできるphpに、定期的にアクセスするようにしたいと思っています。 定期的にアクセスするには、cronを利用すればできると思っていますが、phpへアクセスする方法が分からないために、別の記事にて質問させて頂いています。 (cronが利用できる、レンタルサーバを利用しております。) そこで、いろいろと調べていたところ、.shの拡張子のファイルを作成して、その中に命令事項を記入しておき、cronで.sh(シェルスクリプト?)を実行すれば良いみたいな事が記載されていました。 定期的自動にアクセスしたいphpファイルは複数あるので、phpファイルごとにcronを設定するより、このシェルスクリプトを利用して、複数のphpにアクセスできるようにできれば良いと思いました。 例えば「abc.sh」と言うファイルに、下記を記載してアップロード、パーミッションの設定。 #!/bin/sh/usr/bin/wget -q --spider http://xxx.yyy.com/abc/xxx.php そして、cronで実行日時を設定してこのファイルを実行すれば、「http://xxx.yyy.com/abc/xxx.php」へアクセスするような事が書かれていました。 複数のアドレスにアクセスさせたい場合は、.shのファイルにはどのように記述をすれば良いのでしょうか? またcron終了後にログメールが送信されてきますが、このログメールを送信しないようにするには、どのような記述をすれば良いのでしょうか? 一応調べてみたのですが、確認をお願いします。 abc.sh >/dev/null または abc.sh 2>&1 > /dev/null または abc.sh > /dev/null 2>&1 上記のような、複数の記述方法がありました。 どの記述方法がベターでしょうか。 質問をまとめますと、 複数のphpにアクセスする、シェルスクリプトの記述方法について。 cron終了後のログメールを送信しないようにするための、cronのコマンドの記述方法。 アドバイスを頂けると助かります。

  • シェルスクリプトからPHP実行

    シェルスクリプト(bash)内で、以下のようにPHPを呼んだ場合、 その次の処理がPHPの終了を待たずに実行されるようなのですが、 どうしてでしょうか? #!\bin\bash /usr/local/php4/bin/php /home/test.php echo "test!" 以上 なぜか test! という表示がPHPの処理中に出るように思えます。

  • PHPをバージョンアップしたらCRONが動かない

    CentOSとPHPをバージョンアップしたら、CRONだけが動かなくなってしまいました。 PATH関係が変わったことが問題のような検討がつくのですが、いろいろ試してもうまくいきません。どのように解決したら良いか教えていただければと思います。 [バージョンアップ内容] CentOSを5.3から5.7にバージョンアップ PHPを5.1.6から5.3.3にバージョンアップ phpMyAdmin3.4.8をインストール MySQL 5.0.77(バージョンアップせず) バージョンアップ前には ・PHPからMySQLにデータを登録するプログラムは動作していた。(ウェブサイト形式で動作確認) ・上記のプログラムはCRONで動いていた。(CRONでも動作確認) PHP5.1.6の時はCRONに下記のように登録していました。 10 * * * * /usr/bin/php /var/cron_file/test_cron.php アップデート後にウェブサイト形式でプログラムが動くことを確認しました(ページを開くと下記のプログラムが動作し、データをMySQLに登録) phpMyAdminも問題なく動きます。 CRONの問題点を探し出すために下記のことを行いました。 CRONのステータスを確認 # /etc/rc.d/init.d/crond status crond (pid 32151) を実行中... CRONをリスタート # /etc/init.d/crond restart crond を停止中: [ OK ] crond を起動中: CRONのエラーの確認 # vi /var/log/cron PHPの場所の確認 # find / -name php /usr/share/php /usr/include/php /usr/bin/php /usr/lib64/php /var/lib/php どれがPHPの場所なのかがわからないので、とりあえず5.1.6の時に指定していた「/usr/bin/php」を採用 このあたりはネットで情報を探して、登録してみたので正しいのかどうかよくわかりません。↓ PATHの記入 (その1) # vi /root/.bash_profile PATH=$PATH:/sbin:/usr/sbin:/bin:/usr/bin export PATH (その2) #vi /etc/profile PATH=$PATH:/sbin:/usr/sbin:/bin:/usr/bin export PATH PATHの確認 # env | grep PATH PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/php (上記以外にもいろいろいじっていたら、このようになってしまいました。上記以外のところでどこで設定したかがわからないので、PATHを消す方法も教えていただければと思います) 「/usr/kerberos/sbin:/usr/kerberos/bin」はもともとシステムで登録されていたもので、上記で登録した「/sbin:/usr/sbin:/bin:/usr/bin」以外のもの「/usr/bin/php」などはどこで登録したかわからなくなってしまったものです。 CRONでPATHを指定する部分でPHPのバージョンによりPATHの値が異なるという情報を見つける /usr/bin/php /usr/bin/php5 /usr/bin/php53 各パターンで 「10 * * * * /usr/bin/●● /var/cron_file/test_cron.php」 をcrontab -eに登録してエラーを見てみる。 (1)「*/1 * * * * /usr/bin/php /var/cron_file/test_cron.php」 # vi /var/log/cron →エラーに何も表示されない (2)「*/1 * * * * /usr/bin/php5 /var/cron_file/test_cron.php」 → エラーに何も表示されない。 (3)「*/1 * * * * /usr/bin/php53 /var/cron_file/test_cron.php」 →エラーが表示される Dec 16 20:20:01 ドメイン crond[11412]: (root) CMD (/usr/bin/php5 /var/cron_file/test_cron.php) クローン自体は動いていて、エラーがでているような感じは把握できたのですがここで行き詰まりました。 PHPのパス関係か、MySQLのパス関係、PHPとMySQLの連係、そのあたりのどこかが原因なのでしょうか? 参考資料としてphpinfo()の情報を記載します。 Loaded Configuration File  /etc/php.ini PATH /sbin:/usr/sbin:/bin:/usr/bin 参考)プログラムの内容 --------------------------------------------- require_once ('/var/DB接続情報保存ディレクトリ/password.php') try { $dbh = new PDO($DSN , $DBUSER , $DBPASS); $query=<<<EOF INSERT INTO test (name) VALUES (:name) EOF; $stmt = $dbh->prepare($query);    $name='斉藤太郎'; $stmt->bindParam(':name', $name); $stmt->execute(); }//try_end catch(PDOException $e) { print "Error!: " . $e->getMessage() . "<br>"; die(); }//catch_end ---------------------------------------------

    • ベストアンサー
    • PHP