ฉันจะหยุดการติดตามผลลัพธ์ในเวลาน้อยกว่าโดยไม่มีผลต่อคำสั่งที่สร้างผลลัพธ์ได้อย่างไร


12

ฉันใช้เซิร์ฟเวอร์และบันทึกของเซิร์ฟเวอร์นี้ได้รับการเข้าสู่ระบบใน terminal ไม่ได้อยู่ในไฟล์ใด ๆ ฉันต้องการใช้งานน้อยลงเพื่อดูบันทึกนี้

node server.js | less

เมื่อฉันต้องการดูบันทึกฉันใช้กดShift+ Fเพื่อไปยังจุดสิ้นสุดไฟล์และเฝ้าดูบันทึก เมื่อฉันต้องการที่จะหยุดมันผมใช้+CTRLC

โชคไม่ดีที่นี่หยุดเซิร์ฟเวอร์เช่นกัน ฉันแค่ต้องการหยุดดูจุดสิ้นสุดของบันทึกโดยไม่ต้องหยุดเซิร์ฟเวอร์

ทำอย่างไร


1
คุณต้องการออกจากระบบlessและกลับไปที่ shell prompt ด้วยnodeเซิร์ฟเวอร์ที่ทำงานในพื้นหลังหรือคุณเพียงต้องการlessกลับสู่โหมด non-follow ปกติที่คุณสามารถเลื่อนดูบันทึกแทนการดูบรรทัดล่าสุด?
ผู้บัญชาการ Byte

@ ByteCommander เมื่อฉันกด CTRL + C ฉันต้องการให้เซิร์ฟเวอร์ของฉันทำงานต่อไปและฉันต้องการกลับสู่โหมดที่ไม่ปกติต่อไปนี้ซึ่งฉันสามารถเลื่อนได้
Ajay Kumar

คำตอบ:


17

ฉันไม่พบวิธีออกจากFโหมดในlessดังนั้นคุณจะต้องใช้วิธีแก้ปัญหา ตัวอย่างเช่นบันทึกเอาต์พุตไปยังไฟล์ tmp จากนั้นดู tmpfile นั้นแทน:

node server.js > tmpfile & less tmpfile

&ทำให้node.jsคำสั่งทำงานในพื้นหลัง ซึ่งหมายความว่าless tmpfileจะเริ่มทันทีและจะติดตามไฟล์ tmpfile

เมื่ออยู่ในlessคุณสามารถกดFเพื่อเข้าสู่โหมดติดตาม แต่ตอนนี้Ctrl+ Cจะไม่ฆ่าเซิร์ฟเวอร์ก็จะหยุดการติดตาม ตอนนี้คุณสามารถเลื่อนไปรอบ ๆ ตามที่คุณต้องการและสามารถกดFเพื่อกลับมาทำงานต่อได้


13

ดูเหมือนว่าคุณเป็นปกติไม่ควรจะออกจาก "ไปข้างหน้าตลอดโหมด" ซึ่งเป็นวิธีการคู่มือman lessชื่อโหมดที่คุณป้อนเมื่อกด+ShiftF

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


อย่างไรก็ตามนี่คือเคล็ดลับ:

ฉันคิดว่าคุณเริ่มnode server.js | lessalredy แล้วกดShift+ Fเพื่อเข้าสู่โหมด "Forward Forever" ตอนนี้lessไม่ตอบสนองต่อการกดปุ่มใด ๆ อีกต่อไป

ในสถานะนี้คุณสามารถกดCtrl+ Cเพื่อฆ่ากระบวนการเซิร์ฟเวอร์และสามารถออกlessหลังจากนั้นได้ด้วยการกดQ(ซึ่งด้วยเหตุผลบางประการให้คงคำสั่งไว้เป็นกระบวนการหยุดในรายการงานของคุณ - คุณต้องเรียกใช้fgเพื่อดำเนินการต่อและปล่อยให้มันสมบูรณ์ ยกเลิกหลังจากนั้น) แต่นี่ไม่ใช่สิ่งที่เราต้องการ

คุณสามารถกดCtrl+ Zเพื่อหยุด ("หยุด") คำสั่งและกลับไปที่เชลล์พรอมต์ของคุณ ตอนนี้พิมพ์คำสั่งเชลล์fg(" f ore g round") อย่างรวดเร็วเพื่อให้คำสั่งทำงานต่อหน้า โปรดทราบว่าnodeกระบวนการเซิร์ฟเวอร์ของคุณจะหยุดชั่วคราวในช่วงเวลาสั้น ๆ นี้คุณต้องพิจารณาว่าเรื่องนี้เป็นที่ยอมรับหรือไม่

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

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

วิธีที่ง่ายที่สุดที่ฉันพบคือทำเพียงแค่เปิดless'หน้าจอความช่วยเหลือแล้วปิดอีกครั้งโดยกดปุ่มHและQตามลำดับ ตอนนี้ดูเหมือนว่าทุกอย่างจะทำงานได้ดีอีกครั้ง


วิธีการแก้ปัญหาที่สะอาดที่สุดอาจเป็นไปตามคำตอบของ terdonและเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์ชั่วคราวlessเพื่อใช้ตรวจสอบไฟล์


แฮ็คที่สกปรกค่อนข้างสดใส
TRiG

ฉันคิดว่าฉันชอบคำตอบนี้มากกว่าคำตอบที่ยอมรับ โปรดทราบว่าคุณสามารถเรียกใช้%มากกว่าfg; ฉันพบว่าพิมพ์ได้ง่ายขึ้น / เร็วขึ้น นอกจากนี้ดูเหมือนว่าF(shift-f) ยังใช้งานได้แม้จะไม่ได้ทำhqอุบาย ดี! ตอนนี้เมื่อฉันติดตามบันทึกฉันctrl-z % Enterทำได้ทำสิ่งที่น้อยกว่าของฉันแล้วกลับไปติดตามด้วยการกดปุ่มF!
JoL

BTW คุณไม่ควรเรียกมันว่าสกปรก ส่วนตัวนี้ดูเหมือนว่าสะอาดกว่าโซลูชั่นอื่น ๆ ในขณะที่นี่คุณจะได้ไม่ต้องครอกระบบแฟ้มของคุณด้วยไฟล์ชั่วคราว (ซึ่งคุณต้องคิดชื่อและเอาออกแล้ว) โดยเฉพาะอย่างยิ่งเมื่อคุณอาจต้องการที่จะใช้less's ติดตาม คุณสมบัติในหลายอาคารในเวลาเดียวกัน
JoL

2
ฉันไม่ได้ดูในแหล่งที่มา แต่อาจเป็นไปได้เพราะTSTPสัญญาณขัดจังหวะการเรียกของระบบการอ่านที่กำลังรอข้อมูลใหม่เข้ามา lessรับ 0 ไบต์และสรุปว่าเอาต์พุตสิ้นสุดแล้ว หากต้องการหลีกเลี่ยงการหยุดเซิร์ฟเวอร์ชั่วคราวให้เปิดหน้าต่างเทอร์มินัลใหม่ ดำเนินการpsและระบุรหัสกระบวนการของlessกระบวนการ kill -TSTP <PID>; kill -CONT <PID>แล้วประเภท วิธีนี้สัญญาณควรจะถูกส่งไปกลับโดยไม่ล่าช้าในขณะที่คุณกำลังพิมพ์
alexis

@alexis หากคุณต้องการใช้killคุณสามารถส่ง SIGINT แทนได้ จากนั้นคุณไม่จำเป็นต้องส่งCONTและlessกำลังรอคุณอยู่
muru

3

ตามที่คำถามของคุณบอกว่า:

เซิร์ฟเวอร์นี้เข้าสู่ระบบเทอร์มินัลไม่ใช่ในไฟล์ใด ๆ

ฉันคิดว่าคุณไม่ต้องการใช้ไฟล์บันทึก (ชั่วคราว) บางทีไฟล์บันทึกของคุณมีขนาดใหญ่มากหรือด้วยเหตุผลใดก็ตามที่คุณมี


ไปป์ที่มีชื่อfifoไฟล์

สิ่งที่ฉันเกิดขึ้นคือการใช้ไฟล์ที่named pipe fileรู้จักกันในชื่อfifoไฟล์นี้จะใช้เพื่อไพพ์ล็อกของคุณให้น้อยลงและจะไม่มีการบันทึกอะไรเลย

สร้างครั้งแรกfifo file:

mkfifo mylog

เรียกใช้เซิร์ฟเวอร์ของคุณและเปลี่ยนเส้นทางบันทึกไปที่ไฟล์นี้:

node server.js > mylog &

ใช้น้อยกว่าในการอ่านบันทึกของคุณ (-f บังคับให้น้อยกว่าในการอ่านไฟล์พิเศษนี้):

less -f mylog

ตอนนี้คุณสามารถใช้shift+ FจะปฏิบัติตามและCTRL+ Cเพื่อหยุดการติดตาม แต่เซิร์ฟเวอร์จะยังคงทำงานคุณสามารถทำตามการส่งออกอีกครั้งกับ+shiftF


แผนสำรอง : ถ้ามันหยุดเซิร์ฟเวอร์ของคุณเพียงแค่ใส่คำสั่งของคุณ ( node server.js > mylog &) เป็นเช่นไฟล์: server.shแล้วแทนที่จะวิ่งnode server.js > mylog &วิ่ง: และเรียกใช้bash server.sh > mylog &less -f mylog


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

2
ฉันแนะนำต่อ FIFO ที่นี่เนื่องจากกระบวนการเซิร์ฟเวอร์อาจหยุดทำงานหากบัฟเฟอร์ FIFO ทำงานเต็มเมื่อไม่มีใครร้องขอข้อมูลบันทึก (เพิ่มเติม) หากขนาดของไฟล์บันทึกกลายเป็นปัญหาหนึ่งควรใช้ไฟล์บันทึกที่เหมาะสมบวกlogrotateด้วย
David Foerster

@terdon อย่างที่คุณบอกว่ามีเพียงจุดเดียวที่กำลังบันทึกดิสก์ฉันคิดว่า OP ไม่ต้องการให้บันทึกของเขาถูกบันทึกไว้ในดิสก์
Ravexina

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