Zobacz przekierowanie STDOUT uruchomionego procesu

17

Jeśli uruchomię aplikację za pomocą tego polecenia:

/path/to/my/command >> /var/log/command.log

A polecenie nie wraca, czy istnieje sposób, z innego monitu, aby zobaczyć, na co ustawione jest przekierowanie STDOUT?

Szukam czegoś takiego

cat /proc/PID/redirects

lub

ps -??? | grep PID

ale każda metoda wystarczy.

Bogaty
źródło

Odpowiedzi:

22

Sprawdź deskryptor pliku # 1 (STDOUT) w /proc/$PID/fd/. Jądro reprezentuje ten plik jako symboliczne łącze do pliku, do którego jest przekierowywany deskryptor.

$ readlink -f /proc/20361/fd/1
/tmp/file
Petr Uzel
źródło
Doskonały! Dzięki! Czy możesz podać link lub szczegółowe informacje na temat innych przekierowań, takich jak STDERR, tj. Jakie to numery?
Bogaty
Przynajmniej w Linuksie (i uważam, że w każdym innym znanym systemie operacyjnym UNIX) są to 0: stdin, 1: stdout, 2: stderr (błąd standardowy). Zauważ, że istnieją również makra C zdefiniowane w <stdio.h>: STD {IN, OUT, ERR} _FILENO. Szczegóły w „man stdout”.
Petr Uzel
0, 1, 2 odpowiednio dla stdin, stdout i stderr są gwarantowane we wszystkich systemach Unix / podobnych do Unixa i są również prawdziwe w systemie Windows.
Paul Stelian
na MacOSie jakoś to zrobić? / proc / <pid> / fd / 1 nie istnieje, może mógłbym użyć mkfifo?
Alexander Mills,
4

Przydatnym narzędziem do sprawdzenia, jakie pliki są otwierane przez procesy lsof. Możesz wskazać na konkretny proces lsof -p1234, a zobaczysz głównie te same informacje, które możesz uzyskać ls -l /proc/1234/fdpod Linuksem, tj. Jakie pliki są otwierane.

Najbardziej użyteczną rzeczą lsofjest odwrotność: lsof /path/to/filemówi, jakie procesy używają tego pliku.

Gilles „SO- przestań być zły”
źródło
1

Wiele odpowiedzi mówi o robieniu tego w ten sposób:

tail -f /proc/{PID}/fd/1

Przekonałem się jednak, że to nie zawsze działa. Alternatywnie catczasami daje wyniki.

cat /proc/{PID}/fd/1

gdzie {PID} można sprawdzić za pomocą ps auxpolecenia.

Warto również wspomnieć, że liczbę na końcu polecenia (w tym przypadku fd / 1) można zmienić dla innych wyjść.

 /proc/{PID}/fd/0 # STDIN
 /proc/{PID}/fd/1 # STDOUT
 /proc/{PID}/fd/2 # STDERR
Siergiej Fiodorow
źródło