Lưu màn hình (chương trình) đầu ra vào một tập tin


130

Tôi cần lưu toàn bộ đầu ra của Màn hình vào một tệp để kiểm tra lại tất cả nội dung.

Lý do là tôi bỏ bộ nhớ flash qua cổng nối tiếp, sử dụng Màn hình để giao tiếp với nó. Tôi muốn lưu nó vào một tập tin để kiểm tra cấu trúc bộ nhớ.

Tôi đã thử:

$: screen /dev/ttyUSB0 115200 >> foo.txt
$: screen /dev/ttyUSB0 115200 | tee foo.txt

Và tôi cũng đã thử sử dụng bộ đệm từ màn hình, nhưng tôi không hiểu cách sử dụng nó.

Có đường nào dễ đi không?


Cài đặt sản xuất tôi đang sử dụng có nhiều phiên bản màn hình. Cái mà đầu ra tôi cần có dòng là 'pts / 10'. Do đó tôi nên làm gì để có được đầu ra của nó cho một tập tin?
Sid

Câu trả lời:


129

Có một tùy chọn dòng lệnh để đăng nhập. Đầu ra được lưu vào tập tin screenlog.n, trong đó n là một số của màn hình. Từ trang man của màn hình:

'-L' Tell màn hình để bật ghi nhật ký đầu ra tự động cho các cửa sổ.


6
Cảm ơn. Có cách nào để xuất ra màn hình nào đã có trong bộ đệm đầu ra không? Ví dụ: tôi quên bật ghi nhật ký, nhưng đầu ra có sẵn trong bộ đệm màn hình cuộn - làm thế nào để ghi nó vào một tệp?
Tagar

48
Chỉ cần googled thêm một chút .. Đây là câu trả lời cho nhận xét rõ ràng của tôi - stackoverflow.com/questions/4807474/ Ctrl Ctrl + A và: để vào chế độ lệnh, sau đó hardcopy -h <tên tệp> trong trường hợp ai đó sẽ cần điều này.
Tagar

3
Tệp nhật ký sẽ được tạo trong cùng thư mục mà bạn đã thực hiện màn hình.
lepe

1
Hôm qua tôi đã thực hiện "màn hình -L", ngắt kết nối phiên SSH của mình, đăng nhập lại vào hôm nay và được gắn lại bằng cách sử dụng "screen -r" (tôi chỉ có một), đã thoát và không làm find / -name "screen*log"gì cả.
pacoverflow


104

Bạn cũng có thể sử dụng Control-a + H để lưu loggings vào tệp screenlog.n. Thêm một Control-a + H để tắt.

Ca H: Bắt đầu / kết thúc ghi nhật ký của cửa sổ hiện tại vào tệp "screenlog.n".


5
+1. Nếu nhật ký không thể được tạo, thì hãy thử thay đổi thư mục làm việc của cửa sổ màn hình: Ctrl- a+ :và nhập ví dụchdir /home/foobar/baz
Chriki

2
Ca + H chỉ chuyển cửa sổ màn hình cho tôi. Không có gì để làm với một tệp nhật ký!
aaa90210

2
@ aaa90210 Đó là ctrl-a, sau đó nhấn một chữ h riêng cho bản cứng. ctrl-a theo sau bởi một lần nhấn shift-h riêng biệt bắt đầu một tệp nhật ký hoàn chỉnh.
James

1
Tìm kiếm tệp screenlog.0 được tạo bởi Ctrl-a H? unix.stackexchange.com/questions/198881/ từ
straville

20

Câu trả lời được chọn không hoạt động khá tốt với nhiều phiên và không cho phép chỉ định tên tệp nhật ký tùy chỉnh.

Đối với nhiều phiên màn hình, đây là công thức của tôi:

  1. Tạo một tệp cấu hình cho mỗi quy trình:

    logfile test.log
    logfile flush 1
    log on
    logtstamp after 1
    logtstamp string "[ %t: %Y-%m-%d %c:%s ]\012"
    logtstamp on
    

    Nếu bạn muốn thực hiện "nhanh chóng", bạn có thể thay đổi logfiletự động. \012có nghĩa là "dòng mới", vì sử dụng \nsẽ in nó trên tệp nhật ký: nguồn .

  2. Bắt đầu lệnh của bạn với các cờ "-c" và "-L":

    screen -c ./test.conf -dmSL 'Test' ./test.pl
    

    Đó là nó. Bạn sẽ thấy "test.log" sau lần xả đầu tiên:

    ...
    6 Something is happening...
    [ test.pl: 2016-06-01 13:02:53 ]
    7 Something else...
    [ test.pl: 2016-06-01 13:02:54 ]
    8 Nothing here
    [ test.pl: 2016-06-01 13:02:55 ]
    9 Something is happening...
    [ test.pl: 2016-06-01 13:02:56 ]
    10 Something else...
    [ test.pl: 2016-06-01 13:02:57 ]
    11 Nothing here
    [ test.pl: 2016-06-01 13:02:58 ]
    ...
    

Tôi thấy rằng "-L" vẫn được yêu cầu ngay cả khi "đăng nhập" trên tệp cấu hình.

Tôi không thể tìm thấy danh sách các biến định dạng thời gian (như% m) được sử dụng bởi màn hình. Nếu bạn có một liên kết của các định dạng đó, xin vui lòng gửi nó dưới đây.

Thêm

Trong trường hợp bạn muốn thực hiện "một cách nhanh chóng", bạn có thể sử dụng tập lệnh này:

#!/bin/bash
if [[ $2 == "" ]]; then
    echo "Usage: $0 name command";
    exit 1;
fi
name=$1
command=$2
path="/var/log";
config="logfile ${path}/${name}.log
logfile flush 1
log on
logtstamp after 1
logtstamp string \"[ %t: %Y-%m-%d %c:%s ]\012\"
logtstamp on";
echo "$config" > /tmp/log.conf
screen -c /tmp/log.conf -dmSL "$name" $command
rm /tmp/log.conf

Để sử dụng nó, hãy lưu nó (screen.sh) và đặt quyền + x:

./screen.sh TEST ./test.pl

... và sẽ thực thi ./test.pl và tạo tệp nhật ký trong /var/log/TEST.log


1
Cảm ơn bạn - on-the-flyphần siêu hữu ích.
Ram RS

1
Theo dõi, một màn hình chạy qua đêm với một tập tin cấu hình được tạo ra và xóa một cách nhanh chóng errored ra trên screen -rvới "Unable to open "/tmp/log.conf". Ngoài ra, màn hình đã chuyển từ [detached]trạng thái sang không tồn tại. Điều gì có thể đã là vấn đề?
Ram RS

1
Lệnh của bạn làm gì? màn hình sẽ tạo lại tệp nhật ký khi bị thiếu, vì vậy tôi đoán / tmp / hết dung lượng hoặc có một số vấn đề liên quan đến hệ điều hành khác? Tôi sử dụng phương pháp này trong một số máy chủ chạy vô thời hạn và cho đến nay tôi chưa thấy tình huống như vậy trong ít nhất 1 năm. Nếu bạn muốn chúng tôi có thể bắt đầu một cuộc trò chuyện và tôi có thể giúp bạn gỡ lỗi vấn đề của bạn.
Lepe

1
Tôi nghĩ bạn đã đúng, không nên chấm dứt màn hình nếu bạn đang chạy quy trình theo cách đó, giống như thực thi : screen bash. Nếu bất kỳ quá trình nào khác đang giết chết màn hình của bạn, thì nó sẽ được liệt kê là 'chết', nhưng không biến mất. Tôi không chắc nó có thể là gì.
Lepe

1
@ qräbnö: Bắt đẹp! Tất cả thời gian này và tôi đã không nhận thấy nó. Tôi cập nhật câu trả lời cho phù hợp.
Lepe

20

Lệnh sau hoạt động cho Phiên bản màn hình 4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

Từ trang người đàn ông của Màn hình :

-Logfile file : By default logfile name is "screenlog.0".
                You can set new logfile name with the "-Logfile" option.

Bạn có thể kiểm tra phiên bản hiện có của Màn hình bằng cách sử dụng chuyển đổi màn hình . Bạn có thể tải xuống và cài đặt phiên bản Màn hình mới nhất từ https://www.gnu.org/software/screen/ .


Ngoài ra, bạn có thể để lệnh_to_be_executed ở dạng trống và nhập một loạt các công việc đang chạy dài
devssh

Hãy nhớ có quyền ghi vào thư mục làm việc của màn hình, vì nếu không, nó sẽ âm thầm thất bại (đơn giản là không đăng nhập mà không có bất kỳ cảnh báo nào)
okrutny

15

Đối với thiết bị đầu cuối Mac:

script -a -t 0 out.txt screen /dev/ttyUSB0 115200

Chi tiết

  • script: Một ứng dụng tích hợp để "tạo một bản thảo của phiên cuối"
  • -a: Nối vào tập tin đầu ra
  • -t 0: Thời gian giữa ghi vào tệp đầu ra là 0 giây, do đó out.txt được cập nhật cho mỗi ký tự mới
  • out.txt: Chỉ là tên tệp đầu ra
  • screen /dev/ttyUSB0 115200: Lệnh từ câu hỏi để kết nối với thiết bị bên ngoài

Sau đó, bạn có thể sử dụng đuôi để xem tệp đang cập nhật.

tail -100 out.txt

1
Điều này đã không làm việc cho tôi trên máy Mac. Tệp nhật ký hiển thị tập lệnh bắt đầu lệnh chung và lệnh kết thúc, nhưng không phải dữ liệu nhận được từ lệnh màn hình.
David

10

Ctrl+Asau đó Shift+Hlàm việc cho tôi Bạn có thể xem tập tin screenlog.0trong khi chương trình vẫn đang chạy.


1
Ctrl + A rồi H.
Shimon Doodkin 17/03/18

1
@ShimonDoodkin Tôi đã thử điều đó, vì một số lý do không hoạt động trên Debian. Có thể hữu ích cho những người khác mặc dù. Cảm ơn!
jaggedsoft

5

Lệnh 'script' trong Unix nên thực hiện thủ thuật. Chỉ cần chạy nó khi bắt đầu giao diện điều khiển mới của bạn và bạn sẽ tốt.


tuyệt quá! Nó in ở đâu?
Edoardoo

Nó chỉ nên ghi vào một tập tin. Lệnh hơi lộn xộn nhưng tôi nghĩ điều này có thể giải quyết được một chút: linux.byexamples.com/archives/279/ mẹo
Ruben

5

Đây là một mẹo: bọc nó vào sh -c!

screen sh -c './some-script 2>&1 | tee mylog.log'

Trường hợp 2>&1chuyển hướng stderr đến thiết bị xuất chuẩn để teecó thể bắt và ghi thông báo lỗi.


5

Những điều sau đây có thể hữu ích (đã được thử nghiệm trên: Linux / Ubuntu 12.04 (Tê tê chính xác)):

cat /dev/ttyUSB0

Sử dụng ở trên, sau đó bạn có thể thực hiện tất cả các hướng dẫn lại mà bạn cần. Ví dụ: để kết xuất đầu ra vào bảng điều khiển của bạn trong khi lưu vào tệp của bạn, bạn sẽ làm:

cat /dev/ttyUSB0 | tee console.log

Điều này làm việc cho tôi hoàn hảo. Tôi đang đăng nhập đầu ra màn hình nối tiếp từ một phiên thu thập dữ liệu Arduino.
Ian Forge

3

Một câu trả lời khác nếu bạn cần lưu đầu ra của toàn bộ bộ đệm cuộn từ màn hình đang hoạt động tích cực:

Ctrl-a [ g SPACE G $ >.

Điều này sẽ lưu toàn bộ bộ đệm của bạn vào / tmp / trao đổi màn hình


2

Nhật ký màn hình hiện tại có thể được lưu bằng cách:

Ctrl+A : tên tệp cứng -h

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.