実行されたスクリプトが終了すると、GNU画面がセッションを終了しないようにします


35

私はGNUスクリーンに強制的に「仮想」ターミナルを作成させ、それに接続せずに、内部でスクリプトを実行し、スクリプトが終了したらセッションを終了しないようにしています。

以下を含む多くの組み合わせを試しました。

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をデーモンとして強制的に実行できました。問題は、サーバーと呼ばれるジャンクを使用していることです(QNAP-決してこのジャンクを購入することはありません!)。これはこれを無視しているようです。SSHセッションをログオフするとすぐに、スクリプトが停止します。

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

編集:私もインターネットで見つかった例を試しました:

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

不足なし!それに取り付けた後(screen -R name)ミッドナイトコマンダーが実行されていないことがわかります。作者の例によると、そうなるでしょう。


呼び出す方法ではscreen、1つのウィンドウを作成して1つのコマンドを実行します。コマンドが終了すると、ウィンドウが閉じscreenて何もすることがないため、終了します。
jw013

だから... 2つのウィンドウを開く方法はありますか(コマンドラインのみを使用し、キーボードの組み合わせは使用しません)、1つはスクリプトを実行し、もう1つscreenは閉じないようにしますか?ところで:私はまだその考えを理解していません!を呼び出すとscreen -dmS name、切り離されたウィンドウを作成します。しかし、自動的に閉じられるわけではありません!しかし、その切り離された画面で何かを実行したい場合、実行が完了すると終了します。どうして?ここにはロジックがありません。ウィンドウに何もしないようにすることはできますが、ウィンドウに何かをしてから何もしないようにすることはできませんか?
トレダー

2
コマンドを指定せずにウィンドウを起動すると、「何もしない」ことはありません。それが行っている「何か」は、手動で終了するまで終了しない対話型シェルを実行していることです。
jw013

クール!説明してくれてありがとう!だから...質問に戻って...コマンド実行が終了すると、切り離されたスクリーン/ウィンドウ内でコマンドを実行し、そのセッションを終了しない方法はありますか?また、更新された質問をご覧ください。ありがとうございました。
trejder

このスクリプトは、PHPで記述された2つのUDPリスナーを実行しています。両方ともデーモンとして(&最後に)実行されますが、バグのあるサーバー(QNAP)により、セッションが終了すると終了します(通常のLinuxでは実行しないでください&)。だから、私はstart_udp_listeners.sh終了後に何もするつもりはなく、セッションが終了するのを防ぐ方法だけを探しています。そうでない限り、私のPHPリスナーはうまく機能しています。
trejder

回答:


42

スクリプトの完了後に画面をビジー状態に保つには、ウィンドウ内で何かを永続的に実行し続けるだけです。その「何か」の最も簡単な選択は、おそらくインタラクティブなシェルです。これを行う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上記のfromはインタラクティブなシェル(bash)に切り替わります。このシェルは、外部から何かが終了するまで終了しません。これはscreenbashインスタンスが生きている限り開いたままになります。

1
うーん...あなたは私の人生の救世主だ!:] export IGNOREEOF=1Ctrl + Dによる偶発的な終了を防ぐためにソリューションを拡張すると、完璧なソリューションが得られるはずです。長い間ずっと探していました。ありがとう!:]
trejder

これは、今日のDebianでは機能しません。-cは、代替の.screenrcファイルを読み取るための引数です。
ToVine

@ToVineはDebian Stable(Wheezy)で完全に動作します。でも使っbash -cた。
TranslucentCloud

@TranslucentCloudは、コマンド「bash -c ...」全体を引用符で囲みましたか?最後に試したとき(コメントを書く直前)、それはうまく
いき

@ToVineは私の全コマンドです:screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
TranslucentCloud

2

sh -cDebian 7.8を実行しているraspberry pi 2には運がありませんでした。しかしbash -c、仕事をしました:

コマンド:

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

これは、(Raspberry Piで)別のシェルを使用しているためでしょうか?bashそしてsh二つの異なるシェルのようです。私はこれですべてだと思いますが、私はLinuxにまったく慣れていないので、間違っているかもしれません。
トレジェ

1
shはデフォルトのUNIXシェルで、raspbian(debian)に含まれています。コマンドshも機能しますが、sh -cとscreenの組み合わせは機能しません。
scotty86

@ scotty86に感謝します。LinuxMint 19(Ubuntu 18.04)でも同じことを確認し、変更sh -cbash -c行いました。私はなぜ理解していない、両方shbashインストールされているので、私はまだそれを介して睡眠を失うんだけど、少なくともそれが動作します。
レッサンドロ

shおそらくの/bin/dash代わりにを指し/bin/bashます。Debianはからデフォルトのシェルを切り替えるbashdashは数年前。
scai
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.