Sie können es mit strace tun.
Mit können strace
Sie ausspionieren, was in den Dateideskriptor 1 geschrieben wird, der der Standard-Dateideskriptor ist. Hier ist ein Beispiel:
strace -p $pid_of_process_you_want_to_see_stdout_of 2>&1 | \
sed -re 's%^write\(1,[[:blank:]](.*),[[:blank:]]*[0-9]+\)[[:blank:]]*=[[:blank:]]*[0-9]+%\1%g'
Möglicherweise möchten Sie den Filter verbessern, aber das wäre eine andere Frage. Wir haben die Ausgabe, müssen sie aber jetzt aufräumen.
: WARNUNG: Diese Lösung weist einige Einschränkungen auf, siehe Kommentare unten. Es wird nicht immer funktionieren, Ihr Kilometerstand kann variieren.
Prüfung:
Legen Sie dieses Programm (unten) in die Datei hello
undchmod +x hello
#!/bin/bash
while true
do
echo -en "hello\nworld\n"
done
Dieser in hello1
undchmod +x hello1
#!/bin/bash
dir=$(dirname $0)
$dir/hello >/dev/null
Dieser in hello2
undchmod +x hello2
#!/bin/bash
dir=$(dirname $0)
$dir/hello1 >/dev/null
Führen Sie dann mit aus ./hello2 >/dev/null
, suchen Sie die PID des Prozesses Hallo und geben Sie ein, pid_of_process_you_want_to_see_stdout_of=xyz
wobei xyz die PID des Hallo ist. Führen Sie dann die Zeile oben aus.
Wie es funktioniert. Wenn Hallo ausgeführt wird, Bash-Gabeln, leitet fd 1 an weiter /dev/null
und führt dann Hallo aus. Hello sendet die Ausgabe per Systemaufruf an fd1 write(1, …
. Kernel empfängt Systemaufruf write(1, …
, sieht, dass fd 1 verbunden ist /dev/null
und…
Wir führen dann strace (Systemaufruf-Trace) auf Hallo aus und sehen, dass es write(1, "hello\nworld\n")
den Rest aufruft, wenn die obige Zeile nur die entsprechende Zeile des Trace auswählt.