Linuxで画面を使用している場合、画面にいるかどうかはどうすればわかりますか? exit
を実行すると、画面が表示されていた場合は終了しますが、表示されなかった場合は、ターミナルを閉じてしまいます。
screen -r
、他の画面が接続されているかどうかは確認できましたが、現在の端末がこれらの接続された画面の1つであるかどうかを確認するにはどうすればよいですか?
小切手 $STY
。 nullの場合、「実際の」端末を使用しています。何かが含まれている場合は、現在の画面の名前です。
画面にいない場合:
eric@dev ~ $ echo $STY
eric@dev ~ $
画面にいる場合:
eric@dev ~ $ echo $STY
2026.pts-0.ip-10-0-1-71
もう1つの方法は、$ TERMをエコーすることです。
$ echo $TERM
screen
私はこれを何度も行うことになるので、.bashrcファイルにエイリアスを追加しました。
alias trm='echo $TERM'
この方法では、画面内かどうかに関係なく、 'trm'を実行しただけで、SCREENまたは他の場所(通常はXTERM)にいるかどうかが表示されます。
画面にいるかどうかを確認する別の方法。
タイプ:
Ctrl-a ?
画面のヘルプが表示された場合は、画面にいます。
そうしないと、疑問符「?」が表示されます。プロンプトで。
echo $STY
;これにより、接続された画面がプロセスIDとともに返されます。
$ echo $STY
34046.myScreen
ここにある他のすべてのメソッドは、環境変数(単純にオーバーライドできる)またはscreenのコマンド文字(オーバーライドもできる)に依存しているため、確認する最も簡単な方法は、現在のプロセスのすべての祖先をリストすることです。
pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | grep screen | wc -l
それが1を出力する場合、実行中の現在のプロセスには、実行可能ファイルの名前にWordの「画面」がある祖先があり、それ以外の場合はありませんでした。
より簡単な目視検査は、以下から取得できます。
pstree --show-parents -p $$ | head -n 1 | sed 's/\(.*\)+.*/\1/' | less
次の1つ以上を.bashrc
に追加してください
alias mysession='echo ${STY}'
alias myterm='echo ${TERM}'
alias isscreen='if test -n "$STY"; then echo " screen session: ${STY}"; else echo " NOT a screen session"; fi'
次に、単純なコマンドを入力して、screen
の内部にいるかどうかを確認できます。
リモート(古い)システムにsshを実行したところ、$ TERMが「screen-256color」を使用していることを示していることに気付きましたが、そのためのtermcap/terminfoエントリがなかったため、.bashrcで次の方法で端末が時々ゴミを生成しないようにします。
_case $TERM in
(screen-256color) export TERM='screen'
esac
_
代わりにプレーンエントリを使用するようにします。
TL; DR、$ TERMは通常は、リモートでsshを実行したときにスクリーンセッションにいるかどうかを示します。視覚的な手掛かりだけが必要で、特定のことを行う必要がない場合は、case $TERM in (screen*) echo "you are in a screen session"; esac
を使用できます。
問題に対する私の解決策は、はるかに単純です:ちょうどhitting TAB 内部GNUスクリーンの場合、完全なターミナルブリンク(クイックビデオ反転)を作成します。
ほとんどのLinux(Ubuntu、Kali、Debian、RaspBerry ...など)およびFreeBSD、GUI、およびローカルまたはリモートを含むすべての端末でテスト済み CtrlAltFn もの。
このメソッドのexceptionとして、この(かなり複雑ですが可能)ケースシナリオに注意してください。
screen -S AScr
を入力します。AScr
端末からコンピューターBにSSHで接続します。screen -S BScr
を入力します。ケース2と4ではScreen
の内側、ケース1と3ではScreen
の外側ですが、ケース2、3、4では端末が点滅します。
上記の回答のほとんどの問題は、接続された画面セッションのサブシェルにいる可能性があることです。または、スクリーンセッション内からリモートホストへのシェルを開く場合もあります。前者の場合、プロセスツリーの親子関係を調べて、screen
プログラム名を照合できます。後者の場合、ほとんどの場合、TERM
変数でscreen*
のようなものを確認できます。
私の答えは/ u/Parthian-Shotに似ていますが、pstreeユーティリティにそれほど依存していません。彼が使用するオプションは私には利用できません。一方、私の実装はまだLinuxに依存しています。Linux以外のシステムの場合は、ps
コマンドを調整する必要があります。配列をサポートしていない古いシェルのシステムでは、さらに多くの回避策があります。とにかく:
ps_walk_parents() {
local tmp
local ppid=$PPID
while [[ $ppid != 1 ]]; do
tmp=($( ps -o ppid,comm -p $ppid ))
ppid=${tmp[0]} # grab parent pid
echo ${tmp[1]} # output corresponding command name
done
}
if [[ "$TERM" =~ screen* ]] || ps_walk_parents |grep -qxi screen ; then
# we are in a screen terminal
fi
関数を少し最適化して、プロセスの親がターゲットのコマンド名( "screen")と一致するかどうかを検索するのをやめることもできますが、通常、関数は2〜3回の繰り返ししかヒットしません。おそらく、このコードを.bashrcや.profileなどの起動時の初期化に含めたいので、最適化する価値はありません。