1

サーバーアプリケーションを監視および制御できるWebアプリがあります。Web ページは、アプリケーションを起動するシェル スクリプトを実行することによってアプリケーションを起動します。私たちが遭遇した問題は、apache を再起動する必要がある場合に、Web アプリによって開始されたすべてのプロセスが強制終了されることです。

Web ページは PHP であり、exec()コマンドを使用して開始スクリプトを呼び出しています。開始スクリプトは Java アプリケーションを開始し、次のような方法でアプリケーションを実行します。

nohup java ... &

前述のように、PHP は Linux 上の Apache で実行されています。これらのプロセスをApacheの子プロセスにしない(そして停止すると強制終了される)他のスイッチまたは方法はありますか?

明確化

私は Linux よりも Windows に精通しています。Windows で、ここで試みていることを達成したい場合startは、シェルに次のキーワードを追加します。

start <batchfile>

を使用するstartと、新しいシェル/プロセスを、それを開始したものからフック解除できます。startコマンドに相当する Linux はありますか?

4

3 に答える 3

0

batch(1)を使用して、長期にわたるサーバー プロセスを開始できます。

シェルでは、次のことができます

batch << END
    java yourjava.jar
END

バッチシェルスクリプトファイルがある場合は、それを開始します

batch -f yourbatchfile

Java プログラムを改善できる場合は、おそらくApacheのデーモン機能を使用して、起動時にdaemon(3)を呼び出させることができます。

おそらく、デーモンのプロセス pid をどこかに (たとえば、ファイルやデータベースに) 保存して、デーモンを停止できるようにしたいでしょう (最初に でkill -TERM、次に でkill -QUIT、最後に でkill -KILL)。

daemon関数または Java を使用する方が、batch

于 2012-11-16T06:27:18.953 に答える
0

PHP によって長期にわたるプロセスを開始することは、大きな問題を要求するように聞こえます。あなたのような問題が発生し、セキュリティに大きな影響を与えることになります。

はるかに優れた解決策は、何かをバッチ モードで実行する必要があるという意図を PHP ページにデータベース テーブル (MySQL または PostgreSQL) に保存させることです。

別のプロセス (おそらく apache www ユーザーよりも高度な資格情報で実行されている) はデーモンとして実行され、データベースを常にチェックして、必要なタスクを実行し、必要なタスクを実行する必要があります (また、数分ごとに cron によって起動される可能性もあります)。

このように、一石二鳥です。

于 2012-11-16T09:25:14.457 に答える
0

私は自分のブログで php を使用して長時間実行されるプロセスを作成する方法を書きましたが、特権の分離 (setuid プログラムを使用するか、 sudo はそれを簡単に解決します)。

ここで何を達成しようとしているのかにもよりますが、DJ Bernsteins daemontoolsの追加機能の方が適していると思います。

于 2012-11-16T13:39:04.907 に答える