Jak dowiedzieć się, jaki proces pisze do STDOUT?

19

Mam dwa wystąpienia uruchomionego procesu. Jednym z nich jest „FRYZJA NAS!” i błędy drukowania non stop do STDOUT.

Chcę zabić zepsuty proces, ale muszę się upewnić, że nie zakończę niewłaściwego procesu. Oba zostały uruchomione mniej więcej w tym samym czasie i za pomocą topWidzę, że oba używają mniej więcej tyle samo pamięci i procesora. Nie mogę znaleźć niczego, co wskazywałoby na to, że proces zachowuje się źle.

Najbezpieczniej byłoby dowiedzieć się, który proces / pid pisze do STDOUT.

Czy istnieje jakiś sposób, aby to zrobić?

TCZ8
źródło
1
Zapisywanie na standardowe wyjście oznaczałoby zapisywanie na deskryptorze pliku 1 ((danego procesu), który może być czymś w rodzaju terminala lub /dev/null). Czy na pewno nie masz na myśli konkretnego pliku (takiego jak urządzenie końcowe lub plik dziennika ...)?
Stéphane Chazelas
Jeśli oba zostały uruchomione w tej samej powłoce, oba piszą do STDOUT, więc przypięcie tego nie pomoże ci ustalić, który z nich zabić. Metoda Jofela jest prawdopodobnie tym, czego szukasz.
slm
To, co naprawdę ma na myśli, to to, która produkuje dane wyjściowe na terminalu .
Barmar

Odpowiedzi:

17

W systemie Linux, zakładając, że chcesz wiedzieć, co pisze do tego samego zasobu, do którego podłączony jest stdout twojej powłoki, możesz:

strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/')

Zgłaszałoby to write()wywołania systemowe (na dowolnym deskryptorze pliku) każdego procesu, w którym przynajmniej jeden deskryptor pliku jest otwarty na tym samym pliku, co fd 1 twojej powłoki.

Stéphane Chazelas
źródło
Właśnie to miałem na myśli, spróbuję obu metod dzięki wam obojgu.
TCZ8
23

Możesz zatrzymać oba przetwarzanie, wysyłając im SIGSTOP (zamień pid1 i pid2 na rzeczywiste PID lub użyj killalli nazwę aplikacji):

kill -SIGSTOP pid1 pid2

Drukowanie na terminalu (lub gdziekolwiek przekierowywane jest standardowe wyjście) powinno się zatrzymać. Następnie kontynuuj za pomocą jednego z nich

kill -SIGCONT pid1

Jeśli komunikaty o błędach pojawią się natychmiast, wiesz, że to pierwszy proces. Jeśli nie, możesz zatrzymać go ponownie i kontynuować drugi ...

Przed zabiciem zatrzymanego procesu dobrą praktyką jest wysłanie pierwszego SIGCONT-a.

Tę samą technikę można stosować Ctrl-Zi kontroli pracy shell ( fg %1, bg %1, kill %1, ...).

Jofel
źródło
1
To bardzo dobry sposób na rozwiązanie tego problemu, ale naprawdę szukałem sposobu, aby sprawdzić, kto pisze do terminala. Dziękuję
TCZ8,
Właśnie czytałem to pytanie, wydaje mi się, że miałem pierdnięcie mózgu podczas pisania mojego ostatniego komentarza. To rozwiązałoby również mój problem. Dzięki.
TCZ8,