1

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

4

2 に答える 2

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秒のダウンタイムです。

乾杯

于 2012-04-05T08:33:31.117 に答える
0

shell_exec は、実行したコマンドが戻るまで待機します (たとえば、シェル プロンプトに戻ります)。それをバックグラウンド タスクとして実行したい場合は、shellL_exec がすぐに戻るようにします。

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

もちろん、これは unix/linux ホストでこれを行っていることを前提としています。ウィンドウの場合は、多少異なります。

于 2012-04-05T04:28:16.867 に答える