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ą top
Widzę, ż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ć?
/dev/null
). Czy na pewno nie masz na myśli konkretnego pliku (takiego jak urządzenie końcowe lub plik dziennika ...)?Odpowiedzi:
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:
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.źródło
Możesz zatrzymać oba przetwarzanie, wysyłając im SIGSTOP (zamień pid1 i pid2 na rzeczywiste PID lub użyj
killall
i nazwę aplikacji):Drukowanie na terminalu (lub gdziekolwiek przekierowywane jest standardowe wyjście) powinno się zatrzymać. Następnie kontynuuj za pomocą jednego z nich
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-Z
i kontroli pracy shell (fg %1
,bg %1
,kill %1
, ...).źródło