Ich habe ein Skript auf einem Remotecomputer ausgeführt, als ich lokal daran gearbeitet habe. Ich kann mich über SSH mit dem Computer verbinden und sehe, wie das Skript ausgeführt wird ps
.
$ ps aux | grep ipcheck
myuser 18386 0.0 0.0 18460 3476 pts/0 S+ Dec14 1:11 /bin/bash ./ipchecker.sh
Es wird einfach in einer lokalen Sitzung auf stdout ausgegeben (ich habe es über ./ipchecker.sh
ein lokales Terminalfenster ausgeführt, keine Umleitung, keine Verwendung von screen
usw.).
Gibt es überhaupt eine SSH-Sitzung, in der ich die Ausgabe dieses ausgeführten Befehls anzeigen kann (ohne ihn zu stoppen)?
Bisher ist das Beste, was ich gefunden habe, die Verwendung, strace -p 18386
aber ich bekomme eine Menge Text über den Bildschirm, der viel zu detailliert ist. Ich kann anhalten strace
und dann die Ausgabe sichten und feststellen, dass der Text auf stdout gedruckt ist, aber er ist sehr lang und verwirrend, und natürlich kann ich etwas übersehen, wenn er angehalten ist. Ich möchte einen Weg finden, um die Skriptausgabe live zu sehen, als ob ich lokal arbeiten würde.
Kann jemand dies verbessern? Die offensichtliche Antwort ist, das Skript mit Umleitung oder in einer screen
Sitzung usw. neu zu starten. Dies ist kein geschäftskritisches Skript, also könnte ich das tun. Eher aber sehe ich das als lustige Lernübung.
quelle
strace -p 4232 -e write
Antworten:
Wenn Sie nur den vorhandenen Prozess ausspionieren möchten, können Sie verwenden,
strace -p1234 -s9999 -e write
wobei 1234 die Prozess-ID ist. (-s9999
Vermeiden Sie, dass Zeichenfolgen auf 32 Zeichen gekürzt werden undwrite
der Systemaufruf eine Ausgabe erzeugt.) Wenn Sie nur Daten anzeigen möchten, die in einen bestimmten Dateideskriptor geschrieben wurden, können Sie so etwas wiestrace -p1234 -e trace= -e write=3
nur Daten anzeigen, die in den Dateideskriptor 3 geschrieben wurden (dies-e trace=
verhindert das System) Anrufe werden protokolliert). Dadurch erhalten Sie keine bereits produzierte Ausgabe.Wenn die Ausgabe zu schnell gescrollt wird, können Sie sie an einen Pager wie leiten
less
oder an eine Datei mit sendenstrace -o trace.log …
.Bei vielen Programmen können Sie die nachfolgende Ausgabe mit einem Ptrace-Hack entweder zu Ihrem aktuellen Terminal oder zu einer neuen Bildschirmsitzung umleiten. Siehe Wie kann ich einen laufenden Prozess deaktivieren und einer neuen Bildschirmshell zuordnen? und andere verknüpfte Threads.
Beachten Sie, dass Sie abhängig von der Einrichtung Ihres Systems möglicherweise alle diese
strace
Befehle als Root ausführen müssen, auch wenn der Prozess unter Ihrem Benutzer ohne zusätzliche Berechtigungen ausgeführt wird. (Wenn der Prozess als ein anderer Benutzer ausgeführt wird oder setuid oder setgid ist, müssen Siestrace
als root ausgeführt werden.) Die meisten Distributionen ermöglichen nur die Nachverfolgung der untergeordneten Prozesse (dies bietet einen moderaten Sicherheitsvorteil - es wird eine direkte Malware-Injektion verhindert.) verhindert aber nicht das indirekte Einfügen durch Ändern von Dateien. Dies wird vomkernel.yama.ptrace_scome
sysctl gesteuert .quelle
man strace
Sie können über das
proc
Dateisystem auf die Ausgabe zugreifen .1
= stdout,2
= stderrquelle
/dev/null
) geht - es funktioniert nur, wenn die Ausgabe in eine Datei umgeleitet wird.ping google.es
und in einer anderen als root:tail -f /proc/`pgrep ping`/fd/2
und es wird nichts angezeigt.In BSD können Sie verwenden,
watch
welche Snoops ein bestimmtes tty, zUnter Linux ist es nicht möglich, wenn der Prozess zuvor nicht unter Multiplexer wie
screen
oder ausgeführt wurdetmux
. Siehe auch: Reptyr : Hängen Sie einen laufenden Prozess an ein neues Terminal anEs scheint der einzige Weg ist , den Prozess zu debuggen (zB
strace
,dtrace
/dtruss
,gdb
,lldb
, etc.).Da Sie verwendet haben
strace
, um eine aussagekräftige Ausgabe abzurufen, müssen Sie nach einem qualifizierenden Ausdruck (z. B.file
) filtern und dann die Ausgabe analysieren. Hier ist ein Beispiel:Was es tut, druckt eine Schreiboperation des Prozesses (1000 Länge), der durch die PID spezifiziert ist (verwendet
pgrep
, um ihn durch den Namen zu finden), leitet einen Standardfehler in die Ausgabe um (um gefiltert zu werden) und druckt eine Zeichenkette in doppelten Anführungszeichen.Wenn Sie mit Binärausgabe arbeiten, können Sie Escape-Zeichen mit
read
(mit-r
) undprintf
(mit%b
) analysieren , zPrüfen Sie , ob
help read
weitere Parameter vorhanden sind (z. B.-n
um nach einer bestimmten Anzahl von Zeichen anstatt nach einer neuen Zeile zu drucken).Hier ist ein vollständigeres Beispiel:
Überprüfen Sie für Beispiele, die einen beliebigen Prozess verwenden, Folgendes : Wie kann eine Shell-Verknüpfung in einfachen Text umgewandelt werden? bei Stapelüberlauf
quelle
Sie könnten in der Lage sein auf dem Remote - Bildschirm spähen mit
ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scale
denenlocalhost
von Remote - Server Anmeldeinformationen ersetzt werden soll , und:0.0
mit der Display - Nummer Ihrer GUI.Verwenden Sie
x11vnc
einen VNC-Server für Ihre Bildschirm-X-Sitzung.Wenn Sie auf einer der 6 virtuellen Konsolen laufen, versuchen
sudo setterm -dump 2 -file /dev/stdout
Sie, diese2
durch die entsprechende virtuelle Konsole zu ersetzen .quelle
Ich würde empfehlen, eine Named Pipe (
mkfifo
) zu erstellen und dann in diese Datei zu schreiben. Lesen Sie dann daraus. Sie können dies immer mit Dingen wietail
Minimieren der Ausgabe usw. tun . Wenn Sie die Pipe löschen (daraus lesen), wird sie gelöscht, sodass die Ausgabe nicht beibehalten wird.Die andere Möglichkeit wäre, alles in eine Datei zu schreiben (ähnlich einer Protokolldatei) und sie dann jederzeit zu analysieren. Dies ist die bevorzugte Aktion, wenn Sie die gesamte Ausgabe beibehalten möchten.
quelle
Sie können immer einen Prozess mit nohup und & starten.
Dann können Sie den Fortschritt von jedem Zeitpunkt an überprüfen mit:
Das funktioniert gut für mich.
quelle
Eine sehr einfache Möglichkeit, die Ausgabe zu erhalten, besteht darin, Ihre Ausgabe in einer Datei zu erfassen und diese Datei zu verfolgen.
WENN TUN: ./ipcheck
STATT DO: ./ipcheck> [durch Ihren Dateinamen ersetzen]
Dies würde eine Ausgabedatei erstellen, in der sich Ihr Skript befindet. Von jeder anderen Bash-Shell aus können Sie die Datei dann einfach mit einem Tail versehen:
tail [Ersetze deinen Dateinamen] -f
quelle
setbuf(3)
), was zutail
Problemen führen kann.Analyse der Ausgabe von strace:
Ich habe die Top-Antwort verwendet (mit meiner Prozess-ID von 28223) ...
Um festzustellen, dass es mir wichtig ist
write(9
. (Die 9 wird unten verwendet, ist wahrscheinlich ein Datei-Handle und kann für Ihren Prozess unterschiedlich sein.) Dann habe ich ein schnelles Ruby-Skript geschrieben, um sie zu analysieren und anzuzeigen.Fügen Sie Folgendes ein in
/usr/bin/parse_strace.rb
Nicht vergessen
chmod a+x /usr/bin/parse_strace.rb
Ich rufe auf
strace -xx
(gibt hex aus, damit der reguläre Ausdruck richtig übereinstimmt) und leite (einschließlich STDERR)9
als erstes Argument an mein Skript .Und voila, es gibt das ursprüngliche STDOUT, die Zeilenumbrüche, die Farbe und alles des Prozesses aus!
quelle
Können Sie die Prozess-ID nicht abrufen und mit USR1 kommunizieren?
Das druckt die PID Ihres Skripts und verwendet sie dann für
Ich verstehe, dass USR1 ein "benutzerdefiniertes" Signal ist, was bedeutet, dass jeder, der das Programm erstellt hat, damit "Herunterfahren" oder "Ihre Protokolle sichern" oder "tausendmal drucken" oder was auch immer bedeuten kann.
quelle