Bash Prompt bên dưới đầu ra - Đuôi nhật ký nền


15

Tôi đã từng làm việc cho một công ty có vỏ tùy chỉnh để quản lý một trong những sản phẩm của họ đang chạy trên Linux và tôi đang tìm cách sao chép một tính năng chính của vỏ này.

Tất cả công việc được thực hiện bởi một quy trình nền và đầu ra từ nhật ký được hiển thị cho tất cả người dùng được kết nối.

Nhật ký sẽ theo đuôi trong nền của bạn và dòng dấu nhắc sẽ luôn luôn hoàn hảo ở phía dưới.

Ví dụ

Log line 1
Log line 2
Log line 3
![ROOT@PRODUCT51-LIVE]:~/ #

Cách tôi đã cố gắng thực hiện với bash là bắt đầu một đuôi tách rời trong tệp .bashrc của người dùng, nhưng khi đầu ra từ lệnh được gửi đến stdout - nó xuất hiện dưới dấu nhắc bash, ví dụ

![ROOT@PRODUCT51-LIVE]:~/ #Log line 1
Log line 2
Log line 3

Và người dùng sẽ phải nhấn enter hoặc CtrlCcho một dòng nhắc nhở sạch sẽ.

Tôi không biết làm thế nào để làm cho lời nhắc luôn nhảy xuống cuối sản lượng và tôi nghĩ rằng tôi đang sử dụng thuật ngữ sai để tìm bất cứ điều gì trên Google vì tôi không gặp may - có ai biết cách làm điều này không với bash?


1
Bạn muốn cập nhật đầu ra ngay lập tức hoặc khi bạn nhận được lời nhắc mới?
ahilsend

Ngay lập tức, do đó, nó giống hệt như có thể chỉ chạy "tail -f", nhưng với dấu nhắc ở phía dưới.
iamacarpet

Điều gì xảy ra với tail -fđầu ra và lời nhắc và đầu ra lệnh khi bạn nhập lệnh có số lượng đầu ra đáng kể, đặc biệt là khi quá trình nền của bạn đang chủ động gửi đầu ra của nó?
Tạm dừng cho đến khi có thông báo mới.

Trong trường hợp của họ, các lệnh sẽ chỉ chạy đầu ra thông qua quá trình nền chứ không phải riêng chúng, vì vậy đó không phải là vấn đề. Trong trường hợp này, một khi chúng tôi nhận được một giải pháp mang lại hiệu quả mong muốn, tôi nghĩ đó là một trường hợp chơi và xem đầu ra bị lẫn lộn như thế nào trên cơ sở triển khai thực hiện.
iamacarpet

1
Sau đó, tôi ủng hộ mạnh mẽ đề xuất sử dụng màn hình hoặc tmux. Đầu ra sẽ không bị lẫn hoặc tranh giành không gian màn hình và bạn có thể thay đổi kích thước các cửa sổ (di chuyển phần tách) và cuộn chúng một cách độc lập. Nếu sự phản đối của bạn là các dòng tiêu đề / chân trang / trạng thái "nặng", có một số khả năng để định cấu hình đó. Không có bánh xe phát minh lại.
Tạm dừng cho đến khi có thông báo mới.

Câu trả lời:


1

Sau đây làm những gì bạn cần, mà không cần sử dụng tmux hoặc màn hình hoặc các chương trình khác. Giữ lời nhắc ở phía dưới. Thay thế "/ var / log / cron" bằng bất kỳ tệp nào bạn cần:

#!/bin/bash 
L=$(tput lines)
L1=${L}
(( L1-- ))
C=$(tput cols)
tput cup ${L} 0
tail -f /var/log/cron | while read line; do 
  tput sc
  printf "\e[1;${L1}r\e[${L1};${C}f" 
  echo; echo ${line}
  printf "\e[1;${L}r" && tput rc
done

chìa khóa cho điều này là các ký tự điều khiển ANSI cho thiết bị đầu cuối. Riêng câu lệnh "\ e [x; y" sẽ thiết lập một vùng có thể cuộn mới. Vì vậy, khi mỗi dòng của tệp nhật ký được đọc, dòng dưới cùng trong cửa sổ được loại trừ khỏi vùng có thể cuộn, dòng từ tệp nhật ký được chèn vào, sau đó phần dưới được thêm lại.


Cảm ơn Michael, nó hoạt động rất tốt =] - Tôi thỉnh thoảng gặp sự cố về việc bạn đang gõ trong khi có rất nhiều dòng nhật ký cuộn qua, bạn không thể sao lưu tất cả văn bản trên dòng bảng điều khiển của mình một nhật ký apache bận rộn), nhưng đối với những gì tôi muốn sử dụng nó, nó không phải là một vấn đề.
iamacarpet

@iamacarpet Tuyệt vời. Vui mừng nó làm việc cho bạn.
Michael Martinez

11

Câu trả lời là màn hình hoặc tmux đã được sử dụng

Tôi sẽ giải thích làm thế nào bạn có thể cấu hình như vậy bằng cách sử dụng màn hình

1) Cài đặt màn hình bằng cách sử dụng các dẫn xuất apt-get install screenUbuntu / Debian hoặc yum install screenRedHat.

2) screen -S shell_and_logs

3) Sau đó nhấn Ctrl+ a, theo sau là S(viết hoa S).
Một màn hình ngang sẽ xuất hiện

4) Nhấn Ctrl+ atheo sau TAB
Điều này sẽ nhảy đến cửa sổ chia thứ hai.

5) Tạo một cửa sổ khác ở đây để bạn nhận được dấu nhắc lệnh bằng cách nhấn Ctrl+ anhả phím sau đó nhấnc

6) Bạn có thể thay đổi kích thước của Windo thứ hai bằng cách nhấn Ctrl+ asau đó gõ :resizesau đó Lines:sẽ xuất hiện. Nhập số lượng dòng bạn muốn hiển thị.

7) Cuối cùng, bạn có thể chuyển đổi giữa các cửa sổ bằng cách Ctrl+ atheo sau làTAB

Xem ví dụ dưới đây


Cảm ơn val0x00ff - Tôi thích ý tưởng này, nó hoàn thành công việc - nhưng nó không rõ ràng như trải nghiệm mà hệ thống được đề cập. Đối với người dùng thiếu kinh nghiệm, nó không minh bạch - rõ ràng là một vỏ khác, thay vì chỉ cảm giác như vỏ chính của bạn đang cập nhật cho bạn.
iamacarpet

@iamacarpet Đây tail -F /var/log/messages &là một cách khác để hiển thị cho bạn tin nhắn khi có gì đó thay đổi, ví dụ như khi lỗi đăng nhập được phát hiện hoặc khi một số dịch vụ có vấn đề. Điều này tuy nhiên không lý tưởng vì nó sẽ làm rối vỏ tương tác của bạn.
Valentin Bajrami

Vâng, đó chính xác là những gì tôi đã hỏi - một cách để làm điều đó mà không làm hỏng lớp vỏ tương tác - vì đó là những gì họ đã làm trên vỏ công ty - nhưng thật tuyệt khi không phải viết một cái vỏ từ đầu để hoàn thành nó
iamacarpet

1
@iamacarpet Ngoài ra còn có một loạt các công cụ khác screentmuxcó thể làm điều này - ví dụ như một số tàu BSD có windowlệnh. Đưa ra lựa chọn mặc dù tôi sẽ đề xuất giải pháp này trên một vỏ tùy chỉnh hoặc các tùy chọn khác có sẵn vì tính linh hoạt của nó. Nó có thể không minh bạch đối với người dùng cuối, nhưng họ thực sự sẽ không biết sự khác biệt và người dùng / sysadins mạnh mẽ sẽ có thể sử dụng tính linh hoạt bổ sung được cung cấp bởi screen.
voretaq7

@iamacarpet t=$(mktemp); printf '%s\n' 'screen tail -F /var/log/messages' split focus screen > "$t"; screen -S screenname -c "$t"Đặt nó vào một kịch bản và chạy nó mỗi khi bạn muốn. Cảm ơn geirha vì điều này tại #bash @ irc.freenode.org
Valentin Bajrami
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.