Làm thế nào để chạy một lệnh trong khi đăng nhập đầu ra vào một tập tin?


7

Tôi có một ứng dụng giao diện điều khiển cần được chạy như một phần của việc triển khai phiên bản ứng dụng mới trên máy chủ của tôi.

Ứng dụng bàn điều khiển này được thiết kế để xuất ra bàn điều khiển và không thể thay đổi.

Tôi muốn chạy nó như bình thường, nhưng có thiết bị xuất chuẩn và stderr đăng nhập vào một tệp cùng lúc chúng xuất ra bảng điều khiển.

Làm thế nào tôi có thể làm điều đó trên Linux?


1
Tìm kiếm tee, rất nhiều câu trả lời.
Matt

1
một cách khác sẽ được thực hiện: script -a the_logfile # và sau đó chạy các ứng dụng từ môi trường 'script', nó cũng sẽ ghi lại các ký tự đặc biệt, mã ctrl, v.v. và có thể được sử dụng để "phát lại" màn hình nếu bạn quản lý để sử dụng đúng cách, tức là xem nhật ký từ cùng loại thiết bị đầu cuối và sử dụng cùng một dòng / cột và sử dụng "nhiều hơn" hoặc "ít hơn" để tạo ra các ký tự điều khiển (ví dụ more -v the_logfile:)
Olivier Dulac

Đây có phải là một ứng dụng in một luồng văn bản, hay một ứng dụng chế độ văn bản toàn màn hình?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Chỉ là một dòng văn bản!
Benjamin

Câu trả lời:


7

Bạn có thể sử dụng tee. Ví dụ:

ls -l / | tee tmp.txt

Sẽ in ra thiết bị xuất chuẩn và tmp.txtsẽ chứa một bản sao của đầu ra. Nếu bạn muốn bao gồm stderr trong tmp.txt:

ls -l / 2>&1 | tee tmp.txt

Cảm ơn rất nhiều, chỉ cần thử nó nhưng có vẻ như nó chỉ đăng nhập thiết bị xuất chuẩn, liệu có thể đăng nhập stderr không?
Benjamin

@Benjamin Điều đó nên cmd 2>&1 | tee .... Tôi đã chỉnh sửa nó trong.
goldilocks

Cảm ơn, 2>&1hoạt động tốt!
Benjamin

10

Bạn có thể sử dụng tee http://en.wikipedia.org/wiki/Tee_(command)

Để ống chỉ stdout

cmd | tee log.txt | less

Để ống cả stdout và stderr:

cmd >>(tee stdout.log) 2>>(tee stderr.log >&2)

1
Nên > >được >>?
Supr

Cảm ơn. Sẽ thích câu trả lời của @ goldilocks hơn vì tôi muốn cả stdout và stderr trong cùng một tệp, giống như tôi sẽ thấy chúng trên bảng điều khiển!
Benjamin

3

Có nhiều hướng khác nhau để làm điều đó.

  1. nohup 2>&1 application &. Điều này sẽ gửi tất cả đầu ra đến một tệp gọi là nohup.out. Nó cũng sẽ chụp SIGHUP. Vì vậy, bạn có thể đóng vỏ và nó sẽ tiếp tục chạy. Nếu bạn muốn tyo xem những gì đang xảy ra thì bạn có thể theo dõi đầu ra với tail -f nohop.out.
  2. Các teelệnh sẽ làm như vậy mà không ngăn chặn SIGHUP. C2h và goldilock đã đề cập đến điều này.
  3. Nếu bạn chỉ cần cuộn lại giới hạn, hãy thử screen -L. Điều này được giải thích chi tiết hơn trong bài viết này .

Tôi nhận ra rằng màn hình là một cách giải quyết, nhưng các tính năng khác của nó rất hay cho việc triển khai.

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.