บันทึกหน้าจอ (โปรแกรม) ส่งออกไปยังไฟล์


131

ฉันต้องการบันทึกผลลัพธ์ทั้งหมดของหน้าจอเป็นไฟล์เพื่อตรวจสอบเนื้อหาทั้งหมดในภายหลัง

เหตุผลก็คือฉันทิ้งหน่วยความจำแฟลชผ่านพอร์ตอนุกรมโดยใช้หน้าจอเพื่อเชื่อมต่อกับมัน ฉันต้องการบันทึกลงในไฟล์เพื่อตรวจสอบโครงสร้างหน่วยความจำ

ฉันพยายามแล้ว:

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

และฉันก็พยายามใช้บัฟเฟอร์ไฟล์จากหน้าจอด้วย แต่ฉันไม่เข้าใจวิธีใช้

มีวิธีง่ายๆไหม?


การตั้งค่าการผลิตที่ฉันใช้มีหน้าจอหลายอินสแตนซ์ ผลลัพธ์ที่ฉันต้องการมีบรรทัดเป็น 'pts / 10' ดังนั้นฉันควรทำอย่างไรเพื่อให้ได้ผลลัพธ์เป็นไฟล์
Sid

คำตอบ:


131

มีตัวเลือกบรรทัดคำสั่งสำหรับการบันทึก ผลลัพธ์จะถูกบันทึกลงในไฟล์ screenlog.n โดยที่ n คือตัวเลขของหน้าจอ จากหน้าคนของหน้าจอ:

หน้าจอ '-L' บอกให้เปิดการบันทึกเอาต์พุตอัตโนมัติสำหรับหน้าต่าง


6
ขอบคุณ มีวิธีส่งออกหน้าจอที่มีอยู่แล้วในบัฟเฟอร์เอาต์พุตหรือไม่? เช่นฉันลืมเปิดใช้งานการบันทึก แต่เอาต์พุตมีอยู่ในบัฟเฟอร์หน้าจอเลื่อน - จะเขียนลงในไฟล์ได้อย่างไร?
Tagar

48
เพียงแค่ googled อีกเล็กน้อย .. นี่คือคำตอบสำหรับความคิดเห็นที่ซ้ำซากของฉัน - stackoverflow.com/questions/4807474/… Ctrl + A และ: เพื่อเข้าสู่โหมดคำสั่งจากนั้นจะคัดลอก -h <filename> ในกรณีที่ต้องการสิ่งนี้
Tagar

3
ไฟล์บันทึกจะถูกสร้างขึ้นในไดเร็กทอรีเดียวกับที่คุณเรียกใช้หน้าจอ
lepe

1
เมื่อวานนี้ฉันทำการ "screen -L" ยกเลิกการเชื่อมต่อเซสชัน SSH ของฉันเข้าสู่ระบบอีกครั้งในวันนี้และเชื่อมต่ออีกครั้งโดยใช้ "screen -r" (ฉันมีเพียงอันเดียว) ออกและทำสิ่งfind / -name "screen*log"ที่ไม่พบอะไรเลย
pacoverflow


104

คุณยังสามารถใช้ Control-a + H เพื่อบันทึกการบันทึกลงในไฟล์ screenlog.n อีกหนึ่ง Control-a + H เพื่อปิด

Ca H: เริ่มต้น / สิ้นสุดการบันทึกของหน้าต่างปัจจุบันไปยังไฟล์ "screenlog.n"


5
+1 หากไม่สามารถสร้างบันทึกได้ให้ลองเปลี่ยนไดเร็กทอรีการทำงานของหน้าต่างหน้าจอ: Ctrl- a+ :และพิมพ์ตัวอย่างเช่นchdir /home/foobar/baz
Chriki

2
Ca + H แค่สลับหน้าต่างหน้าจอให้ฉัน ไม่เกี่ยวอะไรกับไฟล์บันทึก!
aaa90210

2
@ aaa90210 มันคือ ctrl-a แล้วกด h แยกต่างหากสำหรับสำเนา ctrl-a ตามด้วยการกด shift-h แยกกันเพื่อเริ่มไฟล์บันทึกทั้งหมด
เจมส์

1
กำลังมองหาไฟล์ screenlog.0 ที่สร้างโดย Ctrl-a H หรือไม่ unix.stackexchange.com/questions/198881/…
straville

20

คำตอบที่เลือกใช้ไม่ได้ผลกับหลายเซสชันและไม่อนุญาตให้ระบุชื่อไฟล์บันทึกที่กำหนดเอง

สำหรับเซสชันหลายหน้าจอนี่คือสูตรของฉัน:

  1. สร้างไฟล์คอนฟิกูเรชันสำหรับแต่ละกระบวนการ:

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

    หากคุณต้องการทำแบบ "ทันที" คุณสามารถเปลี่ยนได้logfileโดยอัตโนมัติ \012หมายความว่า "บรรทัดใหม่" ในขณะที่ใช้\nจะพิมพ์ไว้ในแฟ้มบันทึก: แหล่งที่มา

  2. เริ่มคำสั่งของคุณด้วยแฟล็ก "-c" และ "-L":

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

    แค่นั้นแหละ. คุณจะเห็น "test.log" หลังจากการล้างครั้งแรก:

    ...
    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 ]
    ...
    

ฉันพบว่ายังคงต้องใช้ "-L" แม้ว่า "ล็อกออน" จะอยู่ในไฟล์กำหนดค่าก็ตาม

ฉันไม่พบรายการตัวแปรรูปแบบเวลา (เช่น% m) ที่หน้าจอใช้ หากคุณมีลิงก์ของรูปแบบเหล่านั้นโปรดโพสต์ไว้ด้านล่าง

พิเศษ

ในกรณีที่คุณต้องการทำ "ทันที" คุณสามารถใช้สคริปต์นี้:

#!/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

ในการใช้งานให้บันทึก (screen.sh) และตั้งค่าสิทธิ์ + x:

./screen.sh TEST ./test.pl

... และจะดำเนินการ. / test.pl และสร้างไฟล์บันทึกใน /var/log/TEST.log


1
ขอบคุณ - on-the-flyส่วนนี้มีประโยชน์มาก
Ram RS

1
ติดตามหน้าจอทำงานค้างคืนกับไฟล์ config สร้างและลบได้ทันที errored ออกด้วยscreen -r "Unable to open "/tmp/log.conf"นอกจากนี้หน้าจอยังเปลี่ยนจาก[detached]สถานะเป็นไม่มีอยู่จริง สิ่งที่อาจเป็นปัญหา?
Ram RS

1
คำสั่งของคุณทำอะไร? หน้าจอจะสร้างไฟล์บันทึกใหม่เมื่อหายไปดังนั้นฉันจึงเดาว่า / tmp / ไม่มีพื้นที่ว่างหรือมีปัญหาอื่น ๆ เกี่ยวกับระบบปฏิบัติการ ฉันใช้แนวทางนี้ในเซิร์ฟเวอร์หลายเครื่องซึ่งทำงานไปเรื่อย ๆ จนถึงตอนนี้ฉันยังไม่เห็นสถานการณ์ดังกล่าวอย่างน้อย 1 ปี หากคุณต้องการเราสามารถเริ่มการแชทและเราสามารถช่วยคุณแก้ไขปัญหาของคุณได้
lepe

1
screen bashผมคิดว่าคุณมีสิทธิ์ก็ไม่ควรยุติหน้าจอถ้าคุณกำลังเรียกใช้กระบวนการที่ทางซึ่งเป็นเช่นเดียวกับการดำเนินการ: หากกระบวนการอื่นใดกำลังฆ่าหน้าจอของคุณควรระบุว่า 'ตาย' แต่ไม่หายไป ฉันไม่แน่ใจว่ามันคืออะไร
lepe

1
@ qräbnö: จับได้ดี! ตลอดเวลาและฉันไม่ได้สังเกตเห็นมัน ฉันอัปเดตคำตอบตามนั้น
lepe

20

คำสั่งต่อไปนี้ใช้ได้กับ Screen เวอร์ชัน 4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

จากหน้าคนของหน้าจอ :

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

คุณสามารถตรวจสอบรุ่นที่มีอยู่ของหน้าจอโดยใช้เวอร์ชั่นหน้าจอ คุณสามารถดาวน์โหลดและติดตั้งล่าสุดหน้าจอรุ่นจากhttps://www.gnu.org/software/screen/


นอกจากนี้คุณยังสามารถปล่อย command_to_be_executed ว่างไว้และป้อนชุดของงานที่ดำเนินการมายาวนานได้
devssh

อย่าลืมมีสิทธิ์เขียนไปยังไดเร็กทอรีการทำงานของหน้าจอเพราะมิฉะนั้นจะล้มเหลวโดยเงียบ (เพียงแค่ไม่บันทึกโดยไม่มีการเตือนใด ๆ )
ตกลง

15

สำหรับเครื่อง Mac:

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

รายละเอียด

  • script: แอปพลิเคชันในตัวสำหรับ "สร้างรูปแบบของเซสชันเทอร์มินัล"
  • -a: ผนวกเข้ากับไฟล์เอาต์พุต
  • -t 0: เวลาระหว่างการเขียนไปยังไฟล์เอาต์พุตคือ 0 วินาทีดังนั้น out.txt จึงได้รับการอัพเดตสำหรับอักขระใหม่ทุกตัว
  • out.txt: เป็นเพียงชื่อไฟล์เอาต์พุต
  • screen /dev/ttyUSB0 115200: คำสั่งจากคำถามสำหรับการเชื่อมต่อกับอุปกรณ์ภายนอก

จากนั้นคุณสามารถใช้tailเพื่อดูว่าไฟล์กำลังอัปเดต

tail -100 out.txt

1
สิ่งนี้ใช้ไม่ได้สำหรับฉันบน Mac ล็อกไฟล์แสดงสคริปต์ที่เริ่มต้นทั่วไปและสิ้นสุดคำสั่ง แต่ไม่ใช่ข้อมูลที่ได้รับจากคำสั่งหน้าจอ
เดวิด

10

Ctrl+Aแล้วShift+Hใช้ได้กับฉัน คุณสามารถดูไฟล์screenlog.0ในขณะที่โปรแกรมยังทำงานอยู่


1
Ctrl + A ตามด้วย H
Shimon Doodkin

1
@ShimonDoodkin ฉันลองแล้วด้วยเหตุผลบางอย่างไม่ได้ผลกับ Debian อาจเป็นประโยชน์ต่อผู้อื่นแม้ว่า ขอบคุณ!
jaggedsoft

5

คำสั่ง 'script' ภายใต้ Unix ควรทำเคล็ดลับ เพียงแค่เรียกใช้เมื่อเริ่มคอนโซลใหม่ของคุณและคุณควรจะดี


ที่ดี! มันพิมพ์ที่ไหน?
Edoardoo

มันควรจะเขียนลงไฟล์ คำสั่งค่อนข้างยุ่ง แต่ฉันคิดว่านี่อาจช่วยแก้ปัญหาได้เล็กน้อย: linux.byexamples.com/archives/279/…
Ruben

5

นี่คือเคล็ดลับ: ห่อมันsh -c!

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

โดยที่2>&1เปลี่ยนเส้นทาง stderr ไปยัง stdout เพื่อให้teeสามารถตรวจจับและบันทึกข้อความแสดงข้อผิดพลาด


5

สิ่งต่อไปนี้อาจเป็นประโยชน์ (ทดสอบบน: Linux / Ubuntu 12.04 (Pangolin ที่แม่นยำ)):

cat /dev/ttyUSB0

เมื่อใช้ข้างต้นคุณจะสามารถทำตามคำสั่งใหม่ทั้งหมดที่คุณต้องการได้ ตัวอย่างเช่นในการถ่ายโอนข้อมูลไปยังคอนโซลของคุณขณะบันทึกลงในไฟล์ของคุณคุณจะต้องทำ

cat /dev/ttyUSB0 | tee console.log

อันนี้ใช้ได้ผลสำหรับฉันอย่างสมบูรณ์แบบ ฉันกำลังบันทึกเอาต์พุตของจอภาพอนุกรมจากเซสชันการดักจับข้อมูล Arduino
Ian Pitts

3

คำตอบอื่นหากคุณต้องการบันทึกผลลัพธ์ของบัฟเฟอร์เลื่อนกลับทั้งหมดของคุณจากหน้าจอที่ทำงานอยู่แล้ว:

Ctrl-a [ g SPACE G $ >.

สิ่งนี้จะบันทึกบัฟเฟอร์ทั้งหมดของคุณเป็น / tmp / screen-exchange


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.