Làm thế nào để thay đổi chuyển hướng đầu ra của một quy trình đang chạy?


11

Tôi biết làm thế nào để chuyển hướng đầu ra và làm thế nào để ngăn chặn chúng trong bash. Bây giờ, giả sử tôi vô tình quên gắn phần chuyển hướng đầu ra vào lệnh (ví dụ 2>&1hoặc > /tmp/mystdout) và quá trình nền của tôi đã chạy được một lúc, tôi vẫn có thể thay đổi thành nơi stdoutstderrđang được ghi vào? Tôi thực sự muốn không giết và khởi động lại ứng dụng.

Để cụ thể hơn như được hỏi bởi Gilles trong bình luận của mình, tôi muốn tìm hiểu về nó trong các tình huống cụ thể:

  • tập tin đầu ra sai
  • quên chuyển hướng stderrđếnstdout

Hoặc là một sự kết hợp của cả hai

Ví dụ: tôi có Apache đang chạy và tôi có thể thấy các mô tả tệp:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log

Đổi sang thiết bị đầu cuối khác? Hoặc đến một tập tin? Nếu bạn hài lòng với việc gắn với thiết bị đầu cuối hiện tại hoặc phiên màn hình mới, hãy xem Làm cách nào tôi có thể từ chối một quy trình đang chạy và liên kết nó với vỏ màn hình mới?
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


8

Bạn có thể làm điều đó bằng cách sử dụng reredirect ( https://github.com/jerome-pouiller/reredirect/ ).

reredirect -m /dev/null <PID>

Bạn có thể khôi phục đầu ra ban đầu của quy trình của mình sau đó bằng cách sử dụng:

reredirect -N -O <M> -E <N> <PID>

( <M><N>được cung cấp bởi sự ra mắt trước đó của reredirect).

reredirect READMEcũng giải thích cách chuyển hướng đến một lệnh khác hoặc chỉ chuyển hướng stdout hoặc stderr.


3

Đó là không thể. Hoặc ít nhất là không dễ dàng. Bạn có thể gặp may mắn khi gắn gdb vào quy trình và xử lý nó trong gdb, nhưng điều đó có thể dẫn đến sự cố dễ dàng như thành công.



Hãy chia sẻ chúng, tôi sẽ đưa ra câu trả lời :)
Dennis Kaarsemaker


1
Không hẳn. Tất cả các công cụ được liên kết trong lỗi khác là về việc gắn vào một phiên thiết bị đầu cuối / màn hình khác. Không phải về việc chuyển hướng đến một tập tin khác. Mặc dù có lẽ không khó để vá reptyr để chuyển hướng đến một tệp.
Dennis Kaarsemaker

Tôi đã xem xét một chút về nguồn của reptyr và tôi đồng ý hầu hết với phần "không dễ" của câu trả lời. Có thể lặn sâu hơn vào nó một thời gian sau.
gertvdijk

2

Bạn nên sử dụng reptyr để đính kèm một quy trình khác vào thiết bị đầu cuối hiện tại mới của bạn. Ví dụ: cài đặt và sử dụng screentiện ích của GNU và trong đó khởi chạy reptyrlệnh "tìm nạp" các chuyển hướng của quy trình khác (và thiết bị đầu cuối điều khiển) và gắn chúng vào thiết bị đầu cuối hiện tại mới ( screenquy trình, nếu bạn đã khởi chạy reptyrtừ đó screen). Ưu điểm của việc này từ một screenphiên là, một khi ở dưới screen, nó sẽ dễ dàng ngắt kết nối và kết nối lại với nó (ví dụ: đóng phiên địa phương của bạn, về nhà và mở lại nó).


Cảm ơn câu trả lời của bạn, nhưng nó không giúp tôi với trường hợp của tôi vì tôi không hỏi về việc tháo / lắp thiết bị đầu cuối. Vui lòng đọc lại câu hỏi của tôi và ví dụ cụ thể.
gertvdijk

ah, trong trường hợp đó: đọc mã reptyr, tìm hiểu cách sửa đổi nó để chỉ chuyển hướng stdout hoặc stderr. Sau đó chạy nó từ một shell khác chuyển hướng luồng mới được gắn vào nơi bạn muốn nó đi? (hoặc, tốt hơn, sử dụng nguồn reptyr, thực hiện chuyển hướng trực tiếp)
Olivier Dulac
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.