Linux Screenユーティリティの周りにPHPラッパークラスを作成しようとしています。 名前で画面セッションを開始し、作成された画面のPIDを取得する必要があります。Linux Screenセッションを作成し、そのPIDを取得
セッション名が一意のであるとは仮定できませんので、PIDを見つけるためにsession -ls
の出力を解析できません。
インターネットのまわりの例や提案に基づいて、私はPHPのexec()機能を使用して、次の方法を試してみました:
screen -D -m -S 'screen_name' 2>&1 &
-D
パラメータは、プロセスをforkしないように、画面に指示しますので、同じPIDを持ちますバックグラウンドプロセス。だから、
、その後、私はこの形式である&
背景シェルオペレータの出力からPIDを解析することができます。
Linuxシェルからこのコマンドの動作(すぐに終了)が、私は実行しますそれはPHPからフリーズし、ブラウザはページをロードしません。
PHPのexec()とshell_exec()の両方で実行しようとしましたが、これは同じ結果です。
私はまた、HEREと記載されているようなコマンドの最後の部分で多くの異なる組み合わせを試しました。
編集:
私は、このコマンドを使用する場合:
screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & 2>&1
を次にPHP exec()
作品。それは画面セッションを開始しますが、私は&
バックグラウンド演算子からの出力を取得しません。私はそれがstdout
とstderr
を/dev/null
にリダイレクトしているからだと思っていますが、私が知っている限り、それは画面コマンドではなく、&
オペレータでなければなりません。
ALMOSTソリューション:
screen -D -m -S 'screen_name' 1> /dev/null 2> /dev/null & echo $!
私は&
背景オペレータから端末に示すテキストは、実際にコマンドをstdoutまたはstderrから来ていなかったことに気づきました。それはそれを表示するシェルです。そこで、最後のコマンドで作成されたプロセスのPIDを出力する&
演算子の後にecho $!
を追加しました。
これは端末で動作し、正しいPIDを出力します。しかし、PHPで実行されると、実際の画面のPID値はecho
によって返されたものよりも4倍多くなります。 &
演算子の前にエコーが実行されているようです。それを待たせる方法はありますか?
SOLUTION:私はsudoの中でコマンドをラップして、バックグラウンドのオペレータがsudoコマンドの代わりに、画面の指示に作用していた
。あなたのコマンド引数をエスケープすることを確認してください! :)
もちろんPHPはフリーズします。実行している外部アプリが終了するまでブロックする 'exec'呼び出しを行いました。あなたが添付されている/実行中であることを指示したので、あなたのPHPスクリプト全体がフリーズしてexec()が戻るのを止め、スクリーンが終了するか、切り離されるまで戻らないでしょう。 –
これは '-D'パラメータの意味ではありません。これは 'screen'に古いスクリーンセッションを切り離すよう伝えます。 – Barmar
@MarcBしかし、彼は '&'でバックグラウンドで実行しているので、シェルはコマンドが終了するのを待たずにすぐに終了する必要があります。 – Barmar