2012-04-05 9 views
1

私はゲームサーバーを維持しており、プレイヤーは頻繁にアプリケーションをクラッシュさせます。私のモデレーションチームはサーバープロセスを再起動する必要がありますが、sshアクセスを許可するのは非現実的で安全ではないので、シェルのexecを使用して、Webベースのインターフェイスからサーバープロセスを再起動するのに必要なコマンドを渡します。問題は、シェルセッションが適切にデタッチしないため、PHPは最終的にタイムアウトしてセッションを閉じる/サーバープロセスを停止するまでセッションを維持します。 ここで私はshell_execを呼び出しています: $ command = 'nohup java -jar foobar_server.jar'; shell_exec($コマンド);PHPでターミナルセッションをデタッチする際に問題が発生するshell_exec()

答えて

0

shell_execは実行したコマンドが戻るまで待機します(シェルプロンプトに戻るなど)。もしくはshell_execはすぐに戻りますので、あなたは、バックグラウンドタスクとしてそれを実行したい場合、あなたは、UNIX/Linuxホスト上でこれをやっていると仮定し、もちろん

$command='nohup java -jar foobar_server.jar &'; 
              ^--- run in background 

ください。窓の場合、それはやや異なっているでしょう。

+0

これはうまくいきません。しかし、ありがとう! – user1314327

+0

出力リダイレクションがないので、PHPはあなたがshell_exec()であるプロセスのI/Oパイプを保持します。前の提案に追加するには、コマンドラインに入出力のリダイレクトを追加してください:$ command = 'nohup java -jar foobar_server.jar 2>&1>/dev/null&'; – smassey

+0

これを行うと、エラーストリームが通常のstdoutストリーム(2>&1)にリダイレクトされ、すべてのstdout(現在のstderrを含む)を/ dev/nullにリダイレクトします。これにより、PHPは子プロセスを完全に排除できます。 – smassey

0

これを試しても、動作しないことがわかります。 PHPで完全に切り離すには、stdoutリダイレクションも行う必要があります。shell_execは '&'でもハングします。

この

はあなたが本当にしたいと思うものです:

shell_exec('java -jar foobar_server.jar >/dev/null 2>&1 &'); 

しかし、さらにこの一歩を取るために、私は、Webインターフェイスを取り除くと、この1分間隔cronジョブを作成することになる最初のかどうかをチェックしますプロセスが実行されている、そしてそれは新しいインスタンスを開始いない場合:

#!/bin/bash 
if ! pidof foobar_server.jar; then 
    java -jar foobar_server.jar >/tmp/foobar_server.log 2>&1 &; 
fi 

をそして、それはそれは何もしない実行中のプロセスを見つけた場合には、分ごとに実行する必要があり、そうでなければ、新しいインスタンスを起動します。サーバークラッシュ後の最悪の状況は、59秒のダウンタイムです。

乾杯

+0

これはうまくいくかもしれないので、私はこれを試してみようと思います... しかし、分分のCRONジョブは動作しません。サーバが応答しなくなることはありますが、実際にはクラッシュしないので、プロセスはメモリに残りますが、完全に無駄な状態になることはありません... まだ、あなたの方法を試してみよう! – user1314327

関連する問題