Wyświetl listę procesów uruchamianych w sesji ekranu (Linux)

5

Mam kilka sesji na ekranie, każda z nich ma jedną aplikację Java.

Na przykład mam te 3 sesje na ekranie:

    7361.ARM48      (Detached)
    7397.ROP90      (Detached)
    7314.ARM22      (Detached)

A to jest wyjście ps -A

7314 ?        00:00:00 screen
7329 pts/1    00:00:16 java
7361 ?        00:00:00 screen
7375 pts/2    00:00:02 java
7397 ?        00:00:00 screen
7411 pts/3    00:00:02 java

Czy jest jakiś sposób na niezawodne wykrycie, czy każda sesja na ekranie uruchamia aplikację Java, czy nie?

Rozejrzałem się po podręczniku ekranowym Linuksa, ale nie mogłem znaleźć żadnych poleceń ekranowych, które pokazywałyby procesy potomne sesji ekranowej ( http://linux.die.net/man/1/screen )

Albert
źródło
Próbowałeś uciekać htop a następnie naciśnij & lt; kbd & gt; F5 & lt; / kbd & gt; na widok drzewa?
Dzięki za napiwek, działa naprawdę dobrze, jeśli chcę to sprawdzić ręcznie, ale potrzebuję czegoś bardziej parsowalnego, ponieważ jest to przeznaczone dla skryptu PHP (wyjście htop jest zbyt skomplikowane, aby je analizować). Miałem nadzieję, że ten ekran ma polecenie, które pokaże procesy potomne uruchamiane w sesji.
Albert
Możesz wyświetlić dzieci bieżącej powłoki za pomocą ps. screen -S java1 -X stuff ps "$ (printf '% b' '015')"
Ярослав Рахматуллин

Odpowiedzi:

3

To brzmi jak przypadek

ps fx

działa również dla kilku okien w ramach jednej sesji na ekranie

mjhoffmann
źródło
Czy możesz nieco rozwinąć swoją odpowiedź, aby opracować?
fixer1234
man ps: f ASCII-art process hierarchy (forest); x Lift the BSD-style "must have a tty" restriction, which is imposed upon the set of all processes when some BSD-style (without "-") options are used or when the ps personality setting is BSD-like. The set of processes selected in this manner is in addition to the set of processes selected by other means. An alternate description is that this option causes ps to list all processes owned by you (same EUID as ps), or to list all processes when used together with the a option.
Jay
2

Istnieje kilka opcji, wyjście ps aux można posortować według nazwy terminala i pid. To da ci listę każdego procesu potomnego na każdym ekranie, ale nie będzie wyraźnie kojarzyć (pkt / N) każdego ekranu z procesami wewnątrz niego:

na przykład

$ ps aux | sort -k7.2r  | 
                grep -Ei 'pts|java|screen' | 
                awk '{ printf "%10s %6s %6s %6s %s\n", $1, $2, $7, $9, $11}'
  jaroslav  30700   tty3  Apr07 screen
      root   4933      ?  Mar16 SCREEN
  jaroslav   5024      ?  Mar12 SCREEN
      root   3811      ?  Apr07 sshd:
  jaroslav   3716      ?  Apr07 SCREEN
  jaroslav  11996      ?  Apr05 SCREEN
  jaroslav  11139      ?  Apr05 sshd:
      root   4934  pts/8  Mar16 -/bin/bash
      root   3819  pts/6  Apr07 -bash
  jaroslav   3718  pts/5  Apr07 -/bin/bash
  jaroslav   3810  pts/5  Apr07 ssh
  jaroslav  11998  pts/2  Apr05 -/bin/bash
  jaroslav  11140  pts/1  Apr05 -bash
  jaroslav  12594  pts/1  13:52 sort
  jaroslav  12595  pts/1  13:52 grep
  jaroslav  12596  pts/1  13:52 awk
  jaroslav  12593  pts/1  13:52 ps
  jaroslav   5041  pts/0  Mar12 /bin/bash
  jaroslav   5076  pts/0  Mar12 /usr/lib/jvm//sun-jdk-1.6/bin/

Ewentualnie możesz biegać pstree na każdym ekranie, aby wymienić ich dzieci. To jest prawdopodobnie to, czego szukasz.

$ echo $(pidof  screen;pidof  SCREEN)| tr ' ' \\n  |
       xargs -L1 pstree -lanu

creen,jaroslav -dR serv
screen,jaroslav -dR java3
  `-bash
      `-java -cp /home/jaroslav/src/java/ TestUlimit
          `-11*[{java}]
screen,jaroslav -dR java2
  `-bash
      `-java -cp /home/jaroslav/src/java/ TestUlimit
          `-11*[{java}]
screen,jaroslav -dR java1
  `-bash
      `-java -cp /home/jaroslav/src/java/ TestUlimit
          `-11*[{java}]
screen,jaroslav -dR serv
  `-bash
screen,jaroslav -dmS nailgun /home/jaroslav/bin/nailgun
  `-nailgun /home/jaroslav/bin/nailgun
      `-java -server -jar /usr/share/nailgun/lib/nailgun.jar localhost:64781
          `-16*[{java}]
screen -dR emr
  `-bash
screen,jaroslav -dR gdb
  `-bash
      `-ssh l00

Albo znajdź rodziców każdego procesu Java.

$ for i in `pidof  java`; do pstree -sp $i ;done | grep -v '^ '
init(1)---screen(13097)---bash(13099)---java(13943)-+-{java}(13947)
init(1)---screen(13004)---bash(13006)---java(13927)-+-{java}(13931)
init(1)---screen(12911)---bash(12913)---java(13911)-+-{java}(13915)
init(1)---screen(5024)---nailgun(5041)---java(5076)-+-{java}(5095)
Ярослав Рахматуллин
źródło
echo $(pidof screen;pidof SCREEN)| tr ' ' \\n | xargs -L1 pstree -lanu To zrobiło dokładnie to, czego potrzebowałem. Dzięki!
Jay