Đính kèm vào đầu ra quy trình để xem


111

Làm cách nào để tôi 'đính kèm' một giao diện điều khiển / chế độ xem thiết bị đầu cuối vào đầu ra ứng dụng để tôi có thể biết nó có thể nói gì?

Làm cách nào để tách khỏi đầu ra ứng dụng mà không làm chết ứng dụng?

Thông thường, nếu bạn kích hoạt một ứng dụng nói nhiều bằng dòng lệnh, bạn sẽ thấy tất cả các loại đầu ra tuyệt vời. Tuy nhiên, giả sử tôi có một chương trình chatty đặc biệt đang chạy, như KINO và tôi muốn xem đầu ra của nó tại bất kỳ thời điểm nào mà không cần khởi động lại nó thông qua dòng lệnh. Tôi không thể; ít nhất là tôi không biết làm thế nào.


1
Bạn có biểu tượng gỡ lỗi trong quy trình của mình không? Nó có chạy trong môi trường sản xuất không? Và nếu vậy bạn có cần nó để KHÔNG BAO GIỜ bị tạm dừng không?
yves Baumes

Khi tôi gặp phải các vấn đề về độ ổn định với các chương trình người dùng cuối như kino (sự cố và làm mất âm thanh của tôi), tôi muốn có thể biết làm thế nào / tại sao nó bị lỗi để tôi có thể tìm cách khắc phục. Đây không phải là chương trình tôi đang phát triển mà là một kỹ thuật tôi muốn biết khi gặp sự cố khi quay. Tôi sẽ thử gợi ý của bạn dưới đây.
aggitan

Câu trả lời:


17

Có một số tùy chọn ở đây. Một là chuyển hướng đầu ra của lệnh đến một tệp, sau đó sử dụng 'tail' để xem các dòng mới được thêm vào tệp đó trong thời gian thực.

Một tùy chọn khác là khởi chạy chương trình của bạn bên trong 'màn hình', đây là một loại ứng dụng Terminal dựa trên văn bản. Các phiên màn hình có thể được đính kèm và tách rời, nhưng về mặt danh nghĩa chỉ được sử dụng bởi cùng một người dùng, vì vậy nếu bạn muốn chia sẻ chúng giữa những người dùng, đó là một nỗi đau lớn.


1
"Có một số tùy chọn ở đây. Một là chuyển hướng đầu ra của lệnh đến một tệp, sau đó sử dụng 'tail' để xem các dòng mới được thêm vào tệp đó trong thời gian thực." Điều này có thể được thực hiện với các ứng dụng đã chạy không?
aggitan

2
Có thể bạn cần tail -f $ log_file để lấy kết quả như được ghi trong tệp. Ngoài ra, không, không có cách nào tôi biết để làm điều đó với một ứng dụng đã chạy.
Varkhan

@aggitan: Không. Đối với các ứng dụng hiện có, bạn sẽ phải khởi động lại chúng, vì chúng đã ràng buộc I / O của mình với thiết bị đầu cuối điều khiển.
Don Werve


287

Tôi nghĩ rằng tôi có một giải pháp đơn giản hơn ở đây. Chỉ cần tìm một thư mục có tên tương ứng với PID bạn đang tìm, trong hệ thống tệp giả có thể truy cập được theo /procđường dẫn. Vì vậy, nếu bạn có một chương trình đang chạy, có ID là 1199, hãy cdvào đó:

$ cd /proc/1199

Sau đó, tìm fdthư mục bên dưới

$ cd fd

Thư mục này fdchứa các đối tượng bộ mô tả tệp mà chương trình của bạn đang sử dụng (0: stdin, 1: stdout, 2: stderr) và chỉ là tail -fđối tượng bạn cần - trong trường hợp này là stdout):

$ tail -f 1

9
Tôi không thể sử dụng tailnhư trong trường hợp của tôi, đầu ra đã được chuyển hướng đến một quy trình khác để nhập, nhưng morehiển thị cho tôi dữ liệu hiện tại.
Ωmega

10
Một trong những bài viết hấp dẫn nhất trên trang web này!
robert

2
moređang làm việc cho tôi. ubuntu 14.04 trên một tiến trình nút
Shih-Min Lee

1
Điều này không hoạt động đối với tôi với một quy trình java gọi System.out.println. Không có đầu ra nào cho / proc / [pid] / fd / 1
Nick

1
Đã cố gắng tạo bản sao bằng cách sử dụng bên dưới nhưng vô hiệu: `` docker run -it --name container1 ubuntu bash -c -i "COUNT = 0; while true; do echo Giữ nhịp sàn nhảy tiếp tục; (( COUNT ++)); sleep 1; echo \ "Đếm là: \ $ {COUNT} \"; xong; " `` Trong một thiết bị đầu cuối khác: ``
docker executive -it

54

Tôi đã tìm kiếm điều tương tự chính xác này và thấy rằng bạn có thể làm:

strace -ewrite -p $PID

Nó không chính xác những gì bạn cần, nhưng nó khá gần.

Tôi đã thử chuyển hướng đầu ra, nhưng điều đó không hiệu quả với tôi. Có lẽ vì quá trình ghi vào một ổ cắm, tôi không biết.


Cảm ơn nó hoạt động, nhưng đầu ra bị cắt ngắn, ví dụ: đối với ping: write (1, "64 byte từ 1.0.0.1: icmp_seq =" ..., 56) = 56
izy

8

Làm cách nào để tôi 'đính kèm' một giao diện điều khiển / chế độ xem thiết bị đầu cuối vào đầu ra ứng dụng để tôi có thể biết nó có thể nói gì?

Về câu hỏi này, tôi biết có thể bắt được đầu ra, ngay cả khi bạn không khởi chạy lệnh quyền trượng trước khi khởi chạy processus.

Mặc dù tôi chưa bao giờ thử nó, nhưng tôi đã tìm thấy một bài viết thú vị giải thích cách sử dụng GDB (và không cần khởi động lại quy trình của bạn).

redirect-output-from-a-running-process

Về cơ bản:

  1. Kiểm tra danh sách tệp đang mở để biết quy trình của bạn, nhờ vào / proc / xxx / fd
  2. Đính kèm quy trình của bạn với GDB
  3. Trong khi nó bị tạm dừng, hãy đóng tệp bạn quan tâm, gọi hàm close () (bạn có thể thực hiện bất kỳ hàm nào trong quy trình của mình trong GDB. Tôi nghi ngờ bạn cần ký hiệu gỡ lỗi trong quy trình của mình ..)
  4. Mở một tệp mới gọi hàm create () hoặc open (). (Hãy xem phần nhận xét ở cuối, bạn sẽ thấy mọi người đề xuất sử dụng Dup2 () để đảm bảo cùng một tay cầm sẽ được sử dụng)
  5. Tách quy trình và chạy.

Nhân tiện, nếu bạn đang chạy hệ điều hành linux trên hộp i386, các nhận xét đang nói về một công cụ tốt hơn để chuyển hướng đầu ra sang bảng điều khiển mới: 'retty' . Nếu vậy, hãy xem xét việc sử dụng nó.


6

Đối với tôi, điều này đã hoạt động:

  1. Đăng nhập với tư cách là chủ sở hữu của quy trình (thậm chí rootbị từ chối cấp phép)

    ~$ su - process_owner
    
  2. Đuôi trình mô tả tệp như đã đề cập trong nhiều câu trả lời khác.

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    

2

Tôi muốn xem từ xa quá trình nâng cấp yum đã được chạy cục bộ, vì vậy mặc dù có lẽ có nhiều cách hiệu quả hơn để thực hiện việc này, nhưng đây là những gì tôi đã làm:

watch cat /dev/vcsa1

Rõ ràng là bạn muốn sử dụng vcsa2, vcsa3, v.v., tùy thuộc vào thiết bị đầu cuối đang được sử dụng.

Miễn là cửa sổ đầu cuối của tôi có cùng chiều rộng với cửa sổ đầu cuối mà lệnh đang được chạy, tôi có thể thấy ảnh chụp nhanh đầu ra hiện tại của chúng sau mỗi hai giây. Các lệnh khác được đề xuất ở những nơi khác không hoạt động đặc biệt tốt cho tình huống của tôi, nhưng một trong đó đã thực hiện được mẹo.

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.