Dowiedz się, które polecenie działa w sesji ekranowej

10

Często zostawiam zadania uruchomione na ekranie, aby móc je później sprawdzić, ale czasami muszę sprawdzić, które polecenie działa na ekranie. Zwykle jest to rodzaj skryptu php, takiego jak

screen -d -m nice -n -10 php -f convertThread.php start=10000

Nie rejestruję, które ekrany są uruchomione, które polecenie, ale chciałbym móc poznać postęp dokonany przez sprawdzenie, które polecenie zostało uruchomione w nim, bez zabijania procesu.

Nie widzę żadnej opcji na stronach pomocy ekranowych.

Austin Burk
źródło

Odpowiedzi:

18

Niedawno musiałem to zrobić. Na przepełnieniu stosu odpowiedziałem, jak znaleźć PID procesu uruchomionego na ekranie . Po uzyskaniu PID możesz użyć pspolecenia. Oto treść tej odpowiedzi wraz z dodatkowymi treściami dotyczącymi Twojej sytuacji:

Możesz uzyskać PID sesji ekranowych tutaj w następujący sposób:

$ screen -ls
There are screens on:
        1934.foo_Server         (01/25/15 15:26:01)     (Detached)
        1876.foo_Webserver      (01/25/15 15:25:37)     (Detached)
        1814.foo_Monitor        (01/25/15 15:25:13)     (Detached)
3 Sockets in /var/run/screen/S-ubuntu.

Załóżmy, że chcesz, aby PID programu działał w Bash w foo_Monitorsesji ekranowej. Użyj PID foo_Monitorsesji ekranowej, aby uzyskać PID bashsesji w nim działającej, wyszukując PPID (Parent PID) dla znanego PID:

$ ps -el | grep 1814 | grep bash
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  1815  1814  0  80   0 -  5520 wait   pts/1    00:00:00 bash

Teraz uzyskaj tylko PID bashsesji:

$ ps -el | grep 1814 | grep bash | awk '{print $4}'
1815

Teraz chcemy tego procesu z tym PID. Wystarczy zagnieździć polecenia i tym razem użyć -vflagi, grep bashaby uzyskać proces, który nie jest bash:

$ echo $(ps -el | grep $(ps -el | grep 1814 | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
23869

Możemy użyć tego PID, aby znaleźć polecenie (spójrz na koniec drugiej linii):

$ ps u -p 23869
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dotanco+ 18345 12.1 20.1 5258484 3307860 ?     Sl   Feb02 1147:09 /usr/lib/foo

Poskładać wszystko do kupy:

$ ps u -p $(ps -el | grep $(ps -el | grep SCREEN_SESSION_PID | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
dotancohen
źródło
Och, sprytnie! Lubię to! Ponieważ odpowiada to bezpośrednio na pytanie, przyjmuję tę odpowiedź. Doceniam to! Przepraszam @Ghanima (: '
Austin Burk
7

A co z używaniem screen -S <your-fancy-name>do nadawania sesjom ekranowym znaczących nazw zgodnie z uruchamianymi poleceniami? Nazwy zostaną wymienione na liście screen -lsi będą używane do wznowienia sesji do screen -r <your-fancy-name>.

Edytuj, aby dodać:

Odkąd zwrócono mi na to uwagę innego dnia. tmuxoferuje ten sam zestaw funkcji co screen(jeśli nawet nie więcej) i jest wyposażony w funkcję odpowiadającą Twoim potrzebom. Z FAQ: „tmux obsługuje automatyczne zmienianie nazw okien do uruchomionej aplikacji bez dużych włamań przy użyciu sekwencji ucieczki. Jest nawet domyślnie włączone”.

Ghanima
źródło