実行されたスクリプトが終了したときに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開いています。

答え2

sh -c私のラズベリーパイ2でDebian 7.8を実行する運はありません。しかし、bash -cそれをしました:

注文する:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"

答え3

セッションを終了しない理由は、セッションの出力を失わないためです。この文脈では、script私はLinuxツールを考えました。

rm script_session.log
script -e -f -a script_session.log -c "screen /dev/ttyUSB0 115200"

シリアルUSBアダプタを取り外すとセッションは終了しますが、それでも読み取ることができます。ただし、「script_session.log」に含まれるエスケープシーケンスによって端末から出力が消えるため、そうではscript_session.logありません。あるいはcat、同じツールを使用してファイルからエスケープシーケンスを削除することもできます。geditvi

おそらくscriptセッションを分離するのにも役立ちますscreen

関連情報