実行されたスクリプトが終了したときにGNU画面がセッションを終了するのを防ぐ

実行されたスクリプトが終了したときにGNU画面がセッションを終了するのを防ぐ

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スクリプトを実行して、PHP CLIがデーモンとして実行されるようにすることができます。問題は、私がServer(QNAP - 絶対買わないでください!)というゴミを使っているのですが、これを無視しているようです。 SSHセッションからログアウトすると、スクリプトは停止します。

それで、screenこれが唯一の選択肢のようです。ただし、実行されたコマンドまたはスクリプトが終了すると、なぜセッションを終了するのか理解できません。

編集する:インターネットで見つけた例も試してみました。

screen -dmS name
screen -S name -p windowname -X stuff 'mc
'

不足はありません! ()を追加すると、screen -R nameMidnight Commanderがまだ実行されていないことがわかります。例の作者の言葉にもかかわらず、これは本当です。

ベストアンサー1

スクリプトが完了した後でも画面を忙しく保つには、ウィンドウで何かを実行し続けます。この「モノ」の最も簡単なオプションはおそらくインタラクティブシェルです。これを行う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開いています。

おすすめ記事