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 top
ich 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?
/dev/null
. Sind Sie sicher, dass Sie nicht stattdessen eine bestimmte Datei meinen (z. B. ein Endgerät oder eine Protokolldatei ...)?Antworten:
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:
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.quelle
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
killall
und den Anwendungsnamen):Der Druck auf dem Terminal (oder wo immer stdout umgeleitet wird) sollte anhalten. Setzen Sie dann einen von ihnen mit fort
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-Z
und die Schale Job Kontrollen (fg %1
,bg %1
,kill %1
, ...).quelle