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


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.


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


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