Finden Sie heraus, welcher Befehl in einer Bildschirmsitzung ausgeführt wird

10

Ich lasse Aufgaben oft auf dem Bildschirm laufen, damit ich sie später überprüfen kann, aber manchmal muss ich überprüfen, welcher Befehl auf dem Bildschirm ausgeführt wird. Es ist normalerweise eine Art PHP-Skript wie

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

Ich zeichne nicht auf, welche Bildschirme welchen Befehl ausführen, aber ich möchte ein Gefühl für den Fortschritt bekommen, indem ich überprüfe, welcher Befehl darin ausgeführt wurde, ohne den Prozess abzubrechen.

Ich sehe keine Option dafür auf den Hilfeseiten des Bildschirms.

Austin Burk
quelle

Antworten:

18

Ich musste das kürzlich tun. Beim Stapelüberlauf antwortete ich, wie die PID des im Bildschirm ausgeführten Prozesses ermittelt werden kann . Sobald Sie die PID haben, können psSie den Befehl abrufen. Hier ist der Inhalt dieser Antwort mit einigen zusätzlichen Inhalten, um Ihre Situation anzugehen:

Sie können die PID der Bildschirmsitzungen hier wie folgt abrufen:

$ 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.

Angenommen, Sie möchten, dass die PID des Programms in der foo_MonitorBildschirmsitzung in Bash ausgeführt wird . Verwenden Sie die PID der foo_MonitorBildschirmsitzung, um die PID der darin ausgeführten bashSitzung zu ermitteln, indem Sie die PPIDs (übergeordnete PID) nach der bekannten PID durchsuchen:

$ 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

Holen Sie sich jetzt nur die PID der bashSitzung:

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

Jetzt wollen wir den Prozess mit dieser PID. Verschachteln Sie einfach die Befehle und verwenden Sie diesmal das -vFlag grep bash, um den Prozess zu erhalten, der nicht bash ist:

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

Wir können diese PID verwenden, um den Befehl zu finden (siehe Ende der zweiten Zeile):

$ 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

Alles zusammen:

$ ps u -p $(ps -el | grep $(ps -el | grep SCREEN_SESSION_PID | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
dotancohen
quelle
Oh, klug! Ich mag das! Da dies die Frage direkt beantwortet, werde ich diese Antwort akzeptieren. Ich schätze es! Sorry @ Ghana (: '
Austin Burk
7

Was ist mit der Verwendung screen -S <your-fancy-name>, um den Bildschirmsitzungen aussagekräftige Namen gemäß den von ihnen ausgeführten Befehlen zu geben? Namen werden mit aufgelistet screen -lsund verwendet, um eine Sitzung von fortzusetzen screen -r <your-fancy-name>.

Bearbeiten, um hinzuzufügen:

Da wurde ich erst neulich darauf aufmerksam gemacht. tmuxbietet die gleiche Funktionalität wie screen(wenn nicht sogar noch mehr) und verfügt über eine Funktion, die Ihren Anforderungen entspricht. Aus den FAQ: "tmux unterstützt das automatische Umbenennen von Fenstern in die laufende Anwendung ohne grobe Hacks mithilfe von Escape-Sequenzen. Standardmäßig ist es sogar aktiviert."

Ghanima
quelle