Wie finde ich heraus, welcher Prozess an STDOUT schreibt?

19

Ich habe zwei Instanzen eines Prozesses ausgeführt. Einer von ihnen ist "freaking out!" und Druckfehler nicht zu STDOUT stoppen.

Ich möchte den unterbrochenen Prozess beenden, muss aber sicherstellen, dass ich nicht den falschen beende. Sie wurden beide ungefähr zur gleichen Zeit gestartet und topich kann sehen, dass sie beide ungefähr die gleiche Menge an Speicher und CPU verwenden. Ich kann anscheinend nichts finden, was darauf hindeutet, dass sich der Prozess schlecht verhält.

Am sichersten wäre es, herauszufinden, welcher Prozess / welche PID an STDOUT schreibt.

Gibt es eine Möglichkeit, das zu tun?

TCZ8
quelle
1
In stdout zu schreiben würde bedeuten , in dessen Dateideskriptor 1 ((des fraglichen Prozesses) zu schreiben, der so etwas wie ein Terminal oder sein kann /dev/null. Sind Sie sicher, dass Sie nicht stattdessen eine bestimmte Datei meinen (z. B. ein Endgerät oder eine Protokolldatei ...)?
Stéphane Chazelas
Wenn beide in derselben Shell gestartet wurden, schreiben sie beide an STDOUT. Wenn Sie also die beiden anheften, können Sie nicht erkennen, welche der beiden zu töten ist. Jofels Methode ist wahrscheinlich das, wonach Sie suchen.
SLM
Was er wirklich meint, ist, welche Ausgabe auf dem Terminal erzeugt wird .
Barmar

Antworten:

17

Unter Linux können Sie Folgendes tun, vorausgesetzt, Sie möchten wissen, was auf dieselbe Ressource geschrieben wird, mit der das stdout Ihrer Shell verbunden ist:

strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/')

Das würde die write()Systemaufrufe (für jeden Dateideskriptor) jedes Prozesses melden , bei dem mindestens ein Dateideskriptor in derselben Datei wie fd 1 Ihrer Shell geöffnet ist.

Stéphane Chazelas
quelle
Das ist, was ich anfangs im Sinn hatte, ich werde beide Methoden versuchen, dank euch beiden.
TCZ8
23

Sie können beide Verarbeitungsvorgänge stoppen, indem Sie ihnen SIGSTOP senden (ersetzen Sie pid1 und pid2 durch die tatsächlichen PIDs oder verwenden Sie killallund den Anwendungsnamen):

kill -SIGSTOP pid1 pid2

Der Druck auf dem Terminal (oder wo immer stdout umgeleitet wird) sollte anhalten. Setzen Sie dann einen von ihnen mit fort

kill -SIGCONT pid1

Wenn die Fehlermeldungen sofort angezeigt werden, wissen Sie, dass dies der erste Prozess ist. Wenn nicht, können Sie es wieder stoppen und die zweite fortsetzen ...

Vor dem Beenden eines gestoppten Prozesses empfiehlt es sich, zuerst SIGCONT zu senden.

Die gleiche Technik kann mit verwendet werden Ctrl-Zund die Schale Job Kontrollen ( fg %1, bg %1, kill %1, ...).

Jofel
quelle
1
Das ist ein sehr guter Weg, um Fehler zu beheben, aber ich war wirklich auf der Suche nach einer Möglichkeit, um zu verfolgen, wer zum Terminal schreibt. Vielen Dank
TCZ8
Ich habe gerade diese Frage noch einmal gelesen, als hätte ich einen Hirnfurz beim Schreiben meines letzten Kommentars. Dies würde auch mein Problem beheben. Danke.
TCZ8