GNU screenに、接続せずに「仮想」端末を作成させ、内部でスクリプトを実行し、スクリプトが終了したらセッションを終了しないようにしようとしています。
次のような多くの組み合わせを試しました:
screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh
または
screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh
そしてそれらのどれも機能しませんでした。スクリプトを実行せずにセッションを取得するか、スクリプトを実行しますが、セッションが終了するとセッションが終了するか、「画面セッションが見つかりません」というエラーが表示されます。
私が基本的にやろうとしているのは、PHPで記述されたUDPリスナーを実行し、それを無限ループで動作させることです(リスニングを中断しないでください)。はい— &
でPHPスクリプトを実行できます 最後に、PHPCLIをデーモンとして実行するように強制します。問題は、サーバー(QNAP —決してこのジャンクを購入しないでください!)と呼ばれるジャンクを使用していることです。これは、これを無視しているようです。 SSHセッションをログオフするとすぐに、スクリプトが停止します。
つまり、screen
唯一の選択肢のようです。しかし、実行されたコマンドまたはスクリプトが終了すると、なぜセッションが終了するのか理解できません。
編集 :インターネットで見つかった例も試しました:
screen -dmS name
screen -S name -p windowname -X stuff 'mc
'
不足はありません!添付後(screen -R name
)MidnightCommanderが実行されていないことがわかります。例の作者が言ったが、そうなるだろう。
承認された回答:
スクリプトの完了後に画面をビジー状態に保つには、ウィンドウ内で何かを永続的に実行し続けるだけです。その「何か」の最も簡単な選択は、おそらくインタラクティブシェルです。これを行う1つの方法があります(bash
を想定) インタラクティブシェルの選択として):
screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
-
-dm
:デタッチモードで画面を開始します -
-S
:後で簡単に取得できるように画面のセッション名を設定します -
sh -c '...'
:スクリプトを実行するだけで終了するのではなく、sh -c
を使用します。 複数のコマンドを実行するには -
exec bash
:スクリプトが終了した後、sh
上からインタラクティブシェル(bash
)に切り替わります )、外部の何かがそれを終了するまで決して終了するべきではありません。これにより、screen
が維持されますbash
である限り開きます インスタンスは生きています。