スクリプトから(GNU)画面を実行


11

スクリーンセッション内でスクリプトからアプリケーションを起動したいと思います。
スクリプトがなければ、画面を起動し、crtl-acでN個のウィンドウを開き、各ウィンドウでプログラムを実行します。

私は次を試しました

screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log

しかし、セッションテールをアタッチすると実行されません。直後にセッションを接続し、別の端末からscreen -d -m -S startup実行するscreen -S startup -X exec tail -f /var/log/messagesと機能します。

私は何か見落としてますか ?

AlexDの回答後に編集します。

半分動作するソリューションは

screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log

スクリーンコマンド(-Xの後のコマンド)をチェーンコマンドで実行すると、execが動作しない可能性があります。これは、おそらく、execは、現在のウィンドウが定義されることを期待しているためです。このヒントをくれたAlexDに感謝します。

しかし、奇妙な副作用があります。プログラムが停止すると(スクリーンセッションを接続してテールをcrtl-cするか、テールを殺すと)、スクリーンウィンドウが閉じます。
したがって、動作はCrtl-A cと同じではなく、コマンドを実行
します。別の副作用は、2つのコマンドをチェーンできないことです。


screen 常にそれはツールの正常な機能です:)あなたが実行..so場合-とコマンドが終了を発表しましたされたときに終了しscreen top、あなたが終了したときにtopscreenあまりにも、終了します
ウォーレン

はい、私は今、デーモンとして画面を起動し、execを使用し、screenコマンドを使用して新しいウィンドウを開く(シェルを起動する)ことを試みた理由です。また、execとtailの間、またはscreenとtellの間にtu prepend bashを試しましたが、どちらも機能していません。
半径

回答:


14

このscreen -S test -X screen commandコマンドは、デーモンセッションにウィンドウを追加するために必要なものですが、指定した理由ではありません。-Xはシェルコマンドではなくスクリーンコマンドを使用し、ウィンドウを作成するスクリーンコマンドは紛らわしいことにscreenと呼ばれるため機能します。exec screenコマンドはありません。シェルスクリプトを使用してコマンドを作成しない限り、連鎖もありません(次のようになります:)screen -S script -X screen sh -c 'command1; command2;'

screen -S test -X screenデフォルトのコマンドはシェルであり、シェルを作成した後は、そのシェル内でコマンドを実行する非対話型(および非不正)の方法がないため、コマンドなしで呼び出しても意味がありません。対話型シェルを使用せずに、コマンドを単独で実行することをお勧めします。副作用は、コマンドが終了すると、画面ウィンドウに子がなくなり、閉じることです。

これで、コマンドが終了した後でも、画面にウィンドウを開いたままにしておくことができます。zombiescreenコマンドを使用して、それを有効にします。シーケンスは次のようになります。

screen -d -m -S script
screen -S script -X zombie qr
screen -S script -X screen tail -f /var/log/messages
screen -S script -X screen tail -f /var/log/xinetd.log

インタラクティブに再接続するには:

screen -S script -r

最後に、これらの-Xコマンドをscreenrcスクリプトとして書き換えることができます。

Screenrc:

zombie qr
screen tail -f /var/log/messages
screen tail -f /var/log/xinetd.log

脚本:

screen -d -m -S script -c screenrc

はい、-Xがスクリーンコマンドを使用していることを知っています。 "スクリーンコマンド(-Xの後のコマンド)"を言ったときの意味(わかりません)、画面実行コマンドがありますしかし、あなたが言ったように、非対話型モードで望みどおりに動作させる方法はありません。とにかくAlexDソリューションとあなたがゾンビコマンドを追加すると、私は欲しいものを手に入れました!ありがとう
半径

@東武:ゾンビに言及すると+200!私はその恐ろしいマニュアルでそれを最終的に気付かなかったでしょう!
ブドウ

6

同じ効果Ctrl-A cが必要な場合は、screen代わりにexec次の。

screen -S test -X screen tail -f / var / log / messages
screen -S test -X screen
screen -S test -X screen tail -f /var/log/xinetd.log

また、特定の画面セッションを作成するときに、上記のコマンドを$HOME/.screenrc-younameitscreen -S test -Xプレフィックスなしで)ファイルに移動して起動screen -c $HOME/.screenrc-younameitすることもできます。


Ctrl-A cは3行目にあります。execは、画面が切り離されたときに定義されていない可能性のある現在のウィンドウでexecを実行するため、動作していません。あなたの回避策の連鎖画面とコマンドは素晴らしいです、私はそれを試してみるべきでした!あなたの答えにはセッション作成がなく、無駄な行(2行目、1ウィンドウをスキップ)があるため、私は自分自身に答えを追加します
半径

実際、期待どおりに機能していません。プログラムが停止するとすぐにウィンドウが閉じます。screen -S test -X screen lsを実行すると、ウィンドウが閉じて結果が表示されなくなります。
半径

1

byobuオプションを使用していますか?


私はそれを試してみましたが、どのように役立つかわかりませんが、byobuで有効なソリューションがある場合は大丈夫かもしれませんが、画面のみのソリューションを好むが、アドオンを使用する方がソリューションがない場合よりも優れています!
半径

1

今夜も同じことをしていました。いくつかのファイルを事前に開いて画面を開きたいと思いました。このすべてを理解するのにしばらく時間がかかりましたが、最終的にはかなりうまくいくように見える次のものを思い付きました:


#1/bin/sh 
screen -d -m -S CS140 
screen -S CS140 -X screen -t thread.c 
screen -p 1 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.c\015"'
screen -S CS140 -X screen -t thread.h 
screen -p 2 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.h\015"'
screen -S CS140 -X screen -t palloc.c 
screen -p 3 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/palloc.c\015"'
screen -S CS140 -X screen -t intr-stubs.h 
screen -p 4 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"'
screen -S CS140 -X screen -t pagedir.c 
screen -p 5 -S CS140 -X eval 'stuff "vim cs140-ps2/src/userprog/pagedir.c\015"'
screen -r -d CS140 

これにより、6つの異なる画面が作成され、画面1〜5でさまざまなファイルが開かれます。私はすべての詳細を知っているわけではありませんが、「もの」は本質的に画面に次の引用テキストが画面コマンドではないことを伝えます。「評価」は、引用符に含まれるすべてを評価します。これがなければ screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015" 、引用されたテキストを実行せずに単純にパイプします。Evalは '\ 015'を改行として読み取り、先行するテキストを実行します。

その他の詳細に関してscreen -p 1 -S CS140 -X CMD は、「CS140」という名前の画面セッションの最初のウィンドウに「CMD」を送信するようシェルに指示します。

お役に立てば幸いです!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.