Skąd mam wiedzieć, że działam na „ekranie” linuxa, czy nie?

60

„Ekran” odnosi się do programu wymienionego w Jak ponownie połączyć się z rozłączoną sesją ssh . To dobry obiekt.

Ale jest pytanie, które naprawdę chciałbym wiedzieć. Skąd mam wiedzieć, czy działam na „ekranie”? Różnica polega na:

  • Jeśli tak, wiem, że mogę bezpiecznie zamknąć bieżące okno terminala, np. Zamknąć okno PuTTY, bez utraty sesji powłoki (Bash itp.).
  • Jeśli nie, wiem, że muszę zamknąć wszystkie prace przed zamknięciem okna terminala.

Lepiej, że chcę, aby ten status był wyświetlany w monicie PS1, dzięki czemu będę mógł go zobaczyć automatycznie.

Jimm Chen
źródło
3
Jeśli użyjesz tmux zamiast screena, domyślnie pojawi się mały pasek stanu. Są prawie takie same w przypadku podstawowego użytkowania.
Samuel Edwin Ward,
9
Połóż swój totem na stole i pozwól mu się kręcić. Jeśli nadal się kręci, wszystko w porządku. W przeciwnym razie jesteś na ekranie:]
Konerak,
Możesz także używać byobu z screenem i tmux. Można skonfigurować automatyczne ładowanie przy logowaniu, a następnie naciśnięcie klawisza F6 powoduje rozłączenie i wylogowanie.
mp3foley
Możliwy duplikat Jak sprawdzić, czy jestem w sesji ekranowej?
Andrew Schulman,

Odpowiedzi:

88

(Skradzione z „ Jak mogę stwierdzić, czy jestem na ekranie? ” Na StackOverflow i autorstwa użytkownika jho . PS Nie możesz głosować na duplikat w witrynach StackExchange.)

Sprawdzić $STY. Jeśli jest zerowy, jesteś na „prawdziwym” terminalu. Jeśli coś zawiera, to nazwa ekranu, na którym się znajdujesz.

Jeśli nie jesteś na ekranie:

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

Jeśli jesteś na ekranie:

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

Jeśli używasz tmux zamiast screena, sprawdź także $TMUX. Aby dodać to do pytania, dodaj następujące elementy do ~/.bashrc:

if [ -n "$STY" ]; then export PS1="(screen) $PS1"; fi
if [ -n "$TMUX" ]; then export PS1="(tmux) $PS1"; fi
Wesley
źródło
2
jeśli uruchomisz coś przez sudoto domyślnie nie odziedziczy zmiennych środowiskowych, w tym $STY. Ale jest zwykle propagowane w środowisku sudo, więc może sprawdzić, czy lub$TERM $STY $TERM=="screen"
rcoup
14

Poszukaj, $STYktóry zawiera szczegóły, które screensłużą do komunikowania się ze sobą; $WINDOWbędzie wówczas bieżącym screennumerem okna.

geekozaur
źródło
13

Prostym czekiem, którego zwykle używam, jest po prostu uderzenie Ctrl- a:

  • Jeśli kursor przeskoczy na początek linii , nie jestem w sesji ekranowej.

  • Jeśli nic się nie stanie , wiem, że jestem w sesji ekranowej i że właśnie użyłem klawisza sterowania ekranem. Następnie uderzam a(przeskakuję na początek wiersza), w(pokazuję bieżące okna ekranu) lub wykonuję inne „nieszkodliwe” polecenie ekranowe, aby wrócić do wiersza poleceń.

(Oczywiście działa to tylko wtedy, gdy aktualnie wykonujesz bash lub inne oprogramowanie, które „przeskakuje na początek linii” lub robi coś równoważnie nieszkodliwego po naciśnięciu Ctrl-a.)

Heinzi
źródło
3
Działa to tylko wtedy, gdy klawisz kontroli ekranu jest pozostawiony na domyślnym Ctrl-a, oczywiście.
ShreevatsaR
1
naciśnięcie klawisza Control + DD spowoduje odłączenie i zakończenie ssh. Możesz trafić w tę kombinację dla większej wygody
akostadinov,
Chociaż odpowiedź na pytanie jest dobra, metoda ta nie jest dostępna do pisania skryptów.
Nikodemus RIP
7

Cóż, przez większość czasu (nieobecne czyjeś próby pieprzenia się z rzeczami) TERMbędziesz ustawiony na screen(lub przynajmniej screengdzieś wspomnieć ).

Łatwym rozwiązaniem problemu jest po prostu uruchamianie ekranu wszędzie. Nie wychodź z domu bez tego, mówię.

womble
źródło
$TERMrównież zwykle się rozprzestrzenia sudo, co jest plusem!
rcoup
7

Trzymam to w moim .bashrc:

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

Nie jest to niezawodne, ale za każdym razem, gdy tworzę nowy ekran, wyświetla numer okna w monicie. Jeśli nie biegnę screen, nie ma numeru.

Josh
źródło
3

Mam jeszcze fajniejszy sposób.

Dodaj następujące elementy do ~ / .screenrc, a zobaczysz linię stanu na dole (pokazującą w odwróconym tekście datę, godzinę i obciążenie systemu. Więcej kodów ucieczki znajduje się w linku strony podręcznika poniżej.

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

Źródło tego podczas sesji ekranowej z ctrl-a:source ~/.screenrc.

Muszę za to podziękować Kyleowi Rankinowi z Linux Journal. Zobacz jego fantastyczny artykuł na http://www.linuxjournal.com/article/10950 . Część strony podręcznika, do której się odwołuje, można znaleźć pod adresem http://www.gnu.org/software/screen/manual/screen.html#String-Escapes .

HankCa
źródło
2

możesz również ponownie przeszukać drzewo procesów, $$aby sprawdzić, czy znajdziesz instancję ekranu. dokładny łańcuch prawdopodobnie zależeć będzie od konfiguracji - w moim systemie OS X zshekran wewnętrzny ma loginjako rodzic, SCREENdziadek i screenpradziadek.

Aaron Davies
źródło