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ń?


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

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).

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.