Linuxの「スクリーン」内で実行しているかどうかを確認するにはどうすればよいですか?


60

「画面」とは、切断されたsshセッションに再接続する方法で説明されているプログラムを指します。それは良い施設です。

しかし、私が本当に知りたい質問があります。「スクリーン」内で実行しているかどうかを知る方法は?違いは:

  • はいの場合、シェル(Bashなど)セッションを失うことなく、現在のターミナルウィンドウを安全に閉じることができます。たとえば、PuTTYウィンドウを閉じることができます。
  • いいえの場合、ターミナルウィンドウを閉じる前に保留中の作業を処理する必要があることがわかります。

さらに、このステータスをPS1プロンプトに表示して、いつでも自動的に表示できるようにしたいです。


3
画面の代わりにtmuxを使用すると、デフォルトで小さなステータスバーが表示されます。基本的な使用方法についてはほとんど同じです。
サミュエルエドウィン区

9
テーブルにトーテムを置き、回転させます。回転し続ける場合は問題ありません。それ以外の場合は、画面にいます:]
コネラック

画面とtmuxでbyobuを使用することもできます。ログイン時に自動的にロードし、F6キーを押して切断してログアウトするように設定できます。
mp3foley

回答:


88

(「画面にいるかどうかを確認するにはどうすればよいですか?」から盗まれました。StackOverflowでユーザーjhoによって作成されました。PS StackExchangeサイト間で重複に投票することはできません。)

確認してください$STY。nullの場合、「実際の」端末を使用しています。何かが含まれている場合、それはあなたがいるスクリーンの名前です。

画面にいない場合:

eric@dev ~ $ echo $STY
eric@dev ~ $ 

画面にいる場合:

eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71

screenの代わりにtmuxを使用する場合は、もチェックしてください$TMUX。これをプロンプトに追加するには、次をに追加します~/.bashrc

if [ -n "$STY" ]; then export PS1="(screen) $PS1"; fi
if [ -n "$TMUX" ]; then export PS1="(tmux) $PS1"; fi

2
sudoデフォルトでそれを介して何かを実行すると、などの環境変数を継承しません$STY。ただし通常はsudo環境に伝播されるため、次のいずれかを確認するか、または$TERM $STY $TERM=="screen"
-rcoup

14

自身との通信に使用$STYする詳細を提供するものを探しscreenます。$WINDOWその後、現在のscreenウィンドウ番号になります。


13

私が通常使用する簡単なチェックは、単にヒットすることですCtrl- a

  • 場合は、カーソルが行の先頭にジャンプし、アイム内にない screenセッション。

  • 場合は何も起こりません、私はことを知って、私は内部のだ screenセッションと私はちょうど画面制御キーを使用したこと。次にaw(行の先頭にジャンプする)、(現在の画面ウィンドウを表示する)、または他の「無害な」画面コマンドを実行してコマンドプロンプトに戻ります。

(もちろん、これは現在bashまたは「行の先頭にジャンプする」その他のソフトウェアを実行している場合、またはCtrl-aを押しても同等に無害な場合にのみ機能します。)


3
もちろん、これはスクリーンコントロールキーがデフォルトのCtrl-aのままになっている場合にのみ機能します。
シュ

1
コントロールキー+ DDを押すと、sshが切り離されて終了します。より便利にその組み合わせをヒットすることができます
-akostadinov

実際の質問に対する答えは問題ありませんが、この方法はスクリプト化できません。
ニコデマスRIP 14

7

さて、ほとんどの場合(誰かが物事を台無しにしようとしない)、あなたTERMは設定されますscreen(または少なくともscreenどこかに言及します)。

問題の簡単な解決策は、画面をどこでも実行することです。それなしで家を出ないでください、と私は言います。


$TERMまた、通常はを介して伝播しますがsudo、これはプラスです!
rcoup

7

私はこれを私に保管します.bashrc

 PS1='[\u@\h \W'
 if [ "$WINDOW" ]; then PS1="$PS1 ($WINDOW)"; fi
 PS1="$PS1]$"

これは絶対確実ではありませんが、新しい画面を作成するたびに、ウィンドウ番号がプロンプトに表示されます。私が実行していない場合screen、番号はありません。


3

もっとクールな方法があります。

以下を〜/ .screenrcに追加すると、下にステータス行が表示されます(日付、時刻、システム負荷を反転したテキストで表示します。以下のmanページのリンクにエスケープコードがあります。

    hardstatus alwayslastline
    hardstatus string '%Y-%m-%d %c | %l'

を使用してスクリーンセッションを行うときに、これを取得しctrl-a:source ~/.screenrcます。

Linux JournalのKyle Rankinに感謝します。http://www.linuxjournal.com/article/10950にある彼の素晴らしい記事をご覧ください。彼が言及しているmanページのセクションはhttp://www.gnu.org/software/screen/manual/screen.html#String-Escapesにあります


2

プロセスツリーを上に再帰して$$、スクリーンインスタンスが見つかったかどうかを確認することもできます。正確なチェーンはおそらくセットアップに依存します。私のOS Xボックスでは、zsh内部画面はlogin親、SCREEN祖父母、およびscreengreat祖父母になっています。

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