Czy można odczytać dane wyjściowe z dowolnego procesu przy użyciu jego PID?

32

Czy możliwe jest dołączenie terminala do już działającego procesu przy użyciu jego PID w podobny sposób, jak przy użyciu fgpolecenia dla zadań?

Tommy
źródło
jak co?! jaki proces chcesz dołączyć ?!
Chciałbym móc wyświetlić dane wyjściowe programu uruchomionego w innym terminalu
Tommy,

Odpowiedzi:

43

Możesz uzyskać standardowe deskryptory plików tego procesu, np . stdout:

tail -f /proc/<pid>/fd/1
Jorge Castro
źródło
8
Wypróbowałem to rozwiązanie z topem i wydaje się, że nie działa. W terminalu uruchomiłem top, a w innym użyłem twojego polecenia z corred pid, ale nie otrzymałem danych wyjściowych.
Tommy,
1
Jak to zrobić na komputerze Mac?
Avner Barr,
co z stderr? Zakładam / proc / <pid> / fd / 2, ale w jaki sposób otrzymujesz oba stdout / stderr?
Alexander Mills
1
Co jeśli ten deskryptor wskazuje na gniazdo? Ogon nie może tego odczytać. # ls -la /proc/24510/fd/1 lrwx------ 1 root root 64 Oct 31 08:34 /proc/24510/fd/1 -> socket:[444026]
Imaskar mówi Przywróć Monikę
8

Tutaj jest kilka opcji. Jednym z nich jest przekierowanie wyniku polecenia do pliku, a następnie użycie go taildo przeglądania nowych wierszy dodawanych do tego pliku w czasie rzeczywistym.

Inną opcją jest uruchomienie programu wewnątrz screen, który jest rodzajem tekstowej aplikacji terminalowej. Sesje ekranowe można dołączać i odłączać, ale nominalnie mają one być używane tylko przez tego samego użytkownika, więc jeśli chcesz je udostępnić między użytkownikami.

Jeśli chcesz, możesz śledzić proces i zobaczyć, co on robi z strace:

strace -e trace=open -p 22254 -s 80 -o output.txt
  • -p PID: Dołącz do procesu za pomocą identyfikatora PID procesu i rozpocznij śledzenie.
  • -s SIZE: Określ maksymalny rozmiar ciągu do wydrukowania (domyślnie jest to 32).
  • -o filename: Zapisz dane wyjściowe śledzenia w nazwie pliku, a nie w pliku screen (stderr).
Olorin
źródło
W końcu to nie działa. Uruchomiłem top, a w innym użyłem twojego polecenia z corred pid, ale nie uzyskałem oczekiwanego wyniku. Kiedy potem używam ogona.
Tommy
Musisz użyć sudostrace, aby dołączyć do procesu, i użyj, -o ~/output.txtaby plik pozostał w folderze domowym.
Użyj pliku wyjściowego, nie wysyłaj na ekran! Nie bądź idiotą jak ja i naciśnij Ctrl-C, aby zejść z trasy, a następnie odłącz mój PID. Przestraszyłem mnie gównem na ważnym skrypcie.
Weston Ganger,
3

Możesz użyć poniższych poleceń, aby dołączyć działający proces do innego terminala:

Przykład:

screen -S PID
retty $(pgrep PID)
reptyr PID
devav2
źródło
Nie byłem w stanie znaleźć retty ani gada. Ponadto, aby móc korzystać z ekranu, muszę uruchomić z nim oryginalny proces, aby nie rozwiązał mojego problemu.
Tommy,
można go zainstalować za pomocą polecenia, sudo apt-get install rettyale istnieje kilka ograniczeń dotyczących retty. Sprawdź stronę podręcznika wymienioną w odpowiedzi.
devav2