私はゲームサーバーを維持しており、プレイヤーは頻繁にアプリケーションをクラッシュさせます。私のモデレーションチームはサーバープロセスを再起動する必要がありますが、sshアクセスを許可するのは非現実的で安全ではないので、シェルのexecを使用して、Webベースのインターフェイスからサーバープロセスを再起動するのに必要なコマンドを渡します。問題は、シェルセッションが適切にデタッチしないため、PHPは最終的にタイムアウトしてセッションを閉じる/サーバープロセスを停止するまでセッションを維持します。 ここで私はshell_execを呼び出しています: $ command = 'nohup java -jar foobar_server.jar'; shell_exec($コマンド);PHPでターミナルセッションをデタッチする際に問題が発生するshell_exec()
答えて
shell_execは実行したコマンドが戻るまで待機します(シェルプロンプトに戻るなど)。もしくはshell_execはすぐに戻りますので、あなたは、バックグラウンドタスクとしてそれを実行したい場合、あなたは、UNIX/Linuxホスト上でこれをやっていると仮定し、もちろん
$command='nohup java -jar foobar_server.jar &';
^--- run in background
ください。窓の場合、それはやや異なっているでしょう。
これを試しても、動作しないことがわかります。 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秒のダウンタイムです。
乾杯
これはうまくいくかもしれないので、私はこれを試してみようと思います... しかし、分分のCRONジョブは動作しません。サーバが応答しなくなることはありますが、実際にはクラッシュしないので、プロセスはメモリに残りますが、完全に無駄な状態になることはありません... まだ、あなたの方法を試してみよう! – user1314327
- 1. phpコマンドラインで問題が発生する
- 2. MAMP PROでPhalconをインストールする際に問題が発生する - PHP 7.0.8
- 3. PHPでSQL Serverに接続する際に問題が発生する
- 4. RVMでRubyをインストールする際に問題が発生する
- 5. ドラッグアンドドロップでドラッグイメージをカスタマイズする際に問題が発生する
- 6. VBA.NET関数をPHPに変換する際に問題が発生する
- 7. PHPでセッション変数を渡す際に問題が発生する
- 8. 特定のファイルをアップロードする際に問題が発生するPHP
- 9. "大きな"ファイルを保存する際に問題が発生するPHP
- 10. Androidでアラームを発生させる際に問題が発生する
- 11. ファイルをs3にアップロードする際に問題が発生する
- 12. WAMPでPHP 7を起動する際に問題が発生しました
- 13. PHPで画像をアップロードする際に問題が発生しました
- 14. 問題shell_exec with PHP with ubuntu
- 15. Rstemパッケージをインストールする際に問題が発生する
- 16. QRコードリーダーを実行する際に問題が発生する
- 17. Angularのアプリケーションをビルドする際に問題が発生する
- 18. mp4ファイルをダウンロードする際に問題が発生する
- 19. modalViewControllerを表示する際に問題が発生する
- 20. Java:ファイルをアップロードする際に問題が発生する
- 21. Pootle - プロパティファイルをエクスポートする際に問題が発生する
- 22. Java - スレッドを作成する際に問題が発生する
- 23. バネ - バランサを注入する際に問題が発生する
- 24. Pythonセレンテストを実行する際に問題が発生する
- 25. ASP.NET:SQLスクリプトを実行する際に問題が発生する
- 26. divを複製する際に問題が発生する
- 27. カスタムコントローラーリダイレクトを設定する際に問題が発生する
- 28. pg gemをインストールする際に問題が発生する
- 29. レコードセットを表示する際に問題が発生する
- 30. カスタムカレンダーテーブルiOSを作成する際に問題が発生する
これはうまくいきません。しかし、ありがとう! – user1314327
出力リダイレクションがないので、PHPはあなたがshell_exec()であるプロセスのI/Oパイプを保持します。前の提案に追加するには、コマンドラインに入出力のリダイレクトを追加してください:$ command = 'nohup java -jar foobar_server.jar 2>&1>/dev/null&'; – smassey
これを行うと、エラーストリームが通常のstdoutストリーム(2>&1)にリダイレクトされ、すべてのstdout(現在のstderrを含む)を/ dev/nullにリダイレクトします。これにより、PHPは子プロセスを完全に排除できます。 – smassey