Làm thế nào để tìm ra quá trình viết vào STDOUT?


19

Tôi có hai trường hợp của một quá trình đang chạy. Một trong số đó là "frEAkIng oUT!" và lỗi in không dừng sang STDOUT.

Tôi muốn giết quá trình bị hỏng nhưng tôi phải đảm bảo rằng tôi không chấm dứt sai. Cả hai đều bắt đầu cùng một lúc và sử dụng topTôi có thể thấy cả hai đều sử dụng cùng một lượng bộ nhớ và CPU. Tôi dường như không thể tìm thấy bất cứ điều gì chỉ ra quá trình đang hành xử xấu.

Điều an toàn nhất sẽ là tìm ra tiến trình / pid nào được ghi vào STDOUT.

Có cách nào để làm điều đó?


1
Viết vào thiết bị xuất chuẩn có nghĩa là ghi vào bộ mô tả tệp 1 của nó ((của quá trình đang được đề cập) có thể là bất cứ thứ gì giống như một thiết bị đầu cuối hoặc /dev/null). Bạn có chắc chắn rằng bạn không có nghĩa là một tệp cụ thể thay vào đó (như thiết bị đầu cuối hoặc tệp nhật ký ...)?
Stéphane Chazelas

Nếu cả hai đều được bắt đầu trong cùng một vỏ thì cả hai đều viết cho STDOUT, vì vậy việc ghim này sẽ không giúp bạn xác định được cái nào trong số 2 sẽ bị giết. Phương pháp của Jofel có thể là những gì bạn đang tìm kiếm.
slm

Những gì anh ấy thực sự có nghĩa là cái nào đang sản xuất đầu ra trên thiết bị đầu cuối .
Barmar

Câu trả lời:


17

Trên Linux, giả sử bạn muốn biết những gì đang ghi vào cùng một tài nguyên như thiết bị xuất chuẩn của trình bao của bạn được kết nối với, bạn có thể làm:

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

Điều đó sẽ báo cáo các write()cuộc gọi hệ thống (trên bất kỳ bộ mô tả tệp nào) của mọi quy trình có ít nhất một bộ mô tả tệp mở trên cùng một tệp với fd 1 của trình bao của bạn.


Đó là những gì tôi đã nghĩ trong đầu, tôi sẽ thử cả hai phương pháp nhờ cả hai bạn.
TCZ8

23

Bạn có thể dừng cả hai quá trình xử lý bằng cách gửi cho họ SIGSTOP (thay thế pid1 và pid2 bằng các PID thực tế hoặc sử dụng killallvà tên ứng dụng):

kill -SIGSTOP pid1 pid2

Việc in trên thiết bị đầu cuối (hoặc bất cứ nơi nào thiết bị xuất chuẩn được chuyển hướng đến) sẽ dừng lại. Sau đó tiếp tục một trong số họ sử dụng

kill -SIGCONT pid1

Nếu thông báo lỗi xuất hiện ngay lập tức, bạn sẽ biết quy trình đầu tiên. Nếu không, bạn có thể dừng nó lại và tiếp tục lần thứ hai ...

Trước khi giết một quá trình đã dừng, nên gửi SIGCONT đầu tiên.

Kỹ thuật tương tự có thể được sử dụng với Ctrl-Zvà các điều khiển công việc vỏ ( fg %1, bg %1, kill %1, ...).


1
Đó là một cách rất tốt để khắc phục sự cố nhưng tôi thực sự đang tìm cách để theo dõi ai đang viết vào thiết bị đầu cuối. Cảm ơn bạn
TCZ8

Chỉ đọc lại câu hỏi này, có vẻ như tôi đã bị rắm não trong khi viết bình luận cuối cùng của mình. Điều này cũng sẽ khắc phục vấn đề của tôi. Cám ơn.
TCZ8
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.