3

apache2 で外部書き換えプログラム (prg) を使用して書き換えマップを実行していますが、エラーが発生して終了する可能性があります。書き換えマップが実行されていない場合、システムは明らかに適切に機能しません。

そこで、マップ プログラム (php で記述) を実行し、終了した場合に再起動する単純なラッパー シェル スクリプトを開始したいと考えました。

#!/bin/bash
until /usr/bin/php /somepath/mymap.php; do
  echo "map died but i will restart it right away!" 
done

シェルで手動で試してみると問題なく動作しますが、Web サーバーで起動すると動作しません。

...そして、stdin および stdout ファイルハンドルを介して書き換えエンジンと通信します。マップ関数の検索ごとに、標準入力の改行で終了する文字列として検索するためのキーを受け取ります。次に、検索された値を stdout の改行で終了する文字列として返すか、失敗した場合は 4 文字の文字列 ``NULL'' を返さなければなりません...

その理由は私にはかなり明確に思えます。最初のスクリプトは stdin を受け取りますが、sub スクリプトにリダイレクトしません。

execどうにかして、スクリプトの stdin/stdout を使用して記述子を定義し、適切にリダイレクトする必要があると思います。しかし、どうすればそれを行うことができますか?

4

3 に答える 3

3

一部のスクリプトは「手動で」実行され、間接的に (cron または apache を介して) 実行されると機能しないことがよくあります。

通常、根本原因は次のいずれかです。

  1. スクリプトには追加の環境変数 (PATH、LD_LIBRARY_PATH など) が必要です。
  2. スクリプトには端末が必要です

最初に行うことは、デバッグ情報を取得することです。そのため、スクリプトに追加します。

env > /tmp/$0.env # get environment

stderr を取得します。

... /usr/bin/php /somepath/mymap.php 2>/tmp/$0.stderr ...

そうすることで解決に向かうかもしれません。

スクリプトに端末が必要で、それを修正できない場合は、gnu screen 経由でスクリプトを実行できます。

幸運を。

于 2012-01-03T19:57:59.273 に答える
2

Michał Šrajerは、非常に一般的なトラブルの原因を 1 つ挙げています (環境)。Apache は独自の環境を厳密に設定し、継承されたジャンク値を渡さないため、環境が十分に設定されていることを確認する必要があります。渡すように構成されているもの (SetEnvおよびPassEnvディレクティブ、IIRC) のみを渡します。

もう 1 つの問題は、マッピング プロセスが失敗すると考えていることです。それは心配です。さらに、これは別の問題の兆候であり、それが主な問題だと思います。

マップ プロセスが初めて実行されると、Web サーバーから要求が読み取られますが、マッピングが失敗した場合は再実行されますが、Web サーバーは元の要求からの出力を待機しており、マップ プロセスは待機しています。入力のために、行き詰まりがあります。

子プロセスは、何か変更しない限り、親の標準入力と標準出力を自動的に継承することに注意してください。

失敗する可能性があると思われる場合は、プログラムを再実行するときに入力を再供給できるように、標準入力をキャプチャする必要があります (ただし、最初に失敗したときに 2 回目に機能する理由は別の謎です)。 .

多分:

if tee /tmp/xx.$$ | /usr/bin/php /somepath/mymap.php
then : OK
else
     until /usr/bin/php /somepath/mymap.php < /tmp/xx.$$
     do echo "map died but I will restart it right away!"
     done
fi
rm -f /tmp/xx.$$

未解決の問題には次のものがあります。

  • 一時ファイルが確実に削除されるようにトラップを追加する必要があります。
  • /tmpおそらくディレクトリとして使用しないでください。
  • スクリプト全体が終了するまで、メッセージは Web サーバーに送信されず、そこからクライアント ブラウザーに送信されない可能性があります。
  • 失敗の回数に制限はありません。
  • 失敗のログはありません。
  • 失敗の原因となった問題を修正する試みはありません。
  • そして、おそらく私がまだ考えていない他のものがあるでしょう.
于 2012-01-03T20:14:50.927 に答える
1

untilは有効なキーワードではありません。おそらくエイリアスが設定されており、エイリアスはスクリプトでは機能しません。私の間違い、そうです。

とにかく、これはあなたがしたいことです:

while true; do
    /usr/bin/php /somepath/mymap.php
done

これも失敗する場合は、はい、プログラムが端末を期待しているか、環境に何かが欠けています。

于 2012-01-03T20:23:32.350 に答える