น้อยขัดจังหวะน้อย


13

ฉันมักจะส่งออกโปรแกรมท่อไปยังน้อยเช่น

produce_output | less

สิ่งนี้ใช้งานได้ดีจนกระทั่งproduce_outputสร้างผลลัพธ์จำนวนมาก หากฉันค้นหาข้อความที่อยู่ลึกเข้าไปในไฟล์รายงานน้อยลง

Calculating line numbers... (interrupt to abort)

ถ้าฉันขัดจังหวะด้วย Control + C มันก็ฆ่าproduce_outputซึ่งหยุดมันจากการผลิตผลลัพธ์เพิ่มเติม มีวิธีใดบ้างที่จะส่งการขัดจังหวะให้น้อยลงเพื่อproduce_outputให้ทำงานต่อไปได้?

ฉันรู้ว่าฉันสามารถใช้งานkill -INT less_processได้ แต่ฉันคิดว่าต้องมีทางออกที่ดีกว่า

คำตอบ:


15

โดยปกติกระบวนการทั้งหมดในไปป์ไลน์จะทำงานในกลุ่มกระบวนการเดียวกันทำให้กระบวนการทั้งหมดได้รับสัญญาณ คุณสามารถใช้setsid foo | lessเพื่อรันfooใน pgrp อื่น


จากปัญหาที่เกิดขึ้นจาก OP ดูเหมือนว่าการตัดสินใจใช้ CTRL + C เป็นวิธีการขัดจังหวะน้อยกว่านั้นเป็นเรื่องที่โชคร้ายมาก คุณรู้หรือไม่ว่าเหตุใดสัญญาณนี้จึงถูกเลือก? สัญญาณอื่น ๆ จะมีปัญหาน้อยลงหรือไม่?
Piotr Dobrogost

@PiotrDobrogost: มีสัญญาณอะไรอีกที่คุณอยากแนะนำ มีไม่มากนักที่มีแป้นพิมพ์ลัดเฉพาะ SIGINT (Ctrl-C) และ SIGQUIT (Ctrl- \) และปุ่มหลังมีไว้เพื่อออกจากโปรแกรมในทันทีไม่ใช่แค่ขัดจังหวะ killส่วนที่เหลือจะมีให้เฉพาะผ่านทาง
user1686

ดูเหมือนว่าปัญหาเกิดจากการใช้สัญญาณรบกวนน้อยลง แต่ถ้าเป็นกุญแจ / ทางลัดปกติเราก็จะไม่มีปัญหาในตอนแรก อย่างไรก็ตามฉันเดาว่าความต้องการสัญญาณมาจากข้อเท็จจริงที่ว่ากระบวนการไม่สามารถใช้selectเพื่อรออินพุตจากไฟล์ / ไพพ์และเทอร์มินัลในเวลาเดียวกัน
Piotr Dobrogost

@PiotrDobrogost: เป็นไปได้ว่าFโหมด (ตาม) ทำงานได้อย่างไร ท่อและ ttys สามารถสร้างมลพิษได้ในลักษณะเดียวกัน
user1686

ทำไมคุณคิดว่านั่นเป็นวิธีการทำงานของโหมดติดตาม ฉันคิดว่าการไหลของเหตุการณ์คือเชลล์รับ CTRL + C และส่งสัญญาณ SIGINT ให้น้อยลงซึ่งรับสัญญาณนี้แบบอะซิงโครนัสโดยไม่ต้องฟังคีย์บอร์ด / เทอร์มินัล
Piotr Dobrogost

9

คุณสามารถปิดการใช้งานหมายเลขบรรทัดด้วย

   -n or --line-numbers

ตัวเลือก

produce_output | less -n

-1: อาจแก้ปัญหาการกระตุ้นของ OP แต่ไม่ทำอะไรเลยเพื่อตอบคำถามที่แท้จริงของ OP (เช่นการขัดจังหวะกระบวนการ)
goldPseudo

2
ขออภัย แต่เริ่มต้นน้อยลงด้วยคุณลักษณะที่ไม่ต้องการแล้วลองส่งสัญญาณเพื่อปิดการใช้งานคุณลักษณะที่คุณสามารถปิดใช้งานด้วยสวิตช์เป็นวิธีแก้ปัญหาและไม่ใช่วิธีแก้ปัญหา แน่นอนว่าโซลูชัน @grawity นั้นดี (และฉันโหวตให้) แต่มาที่: เริ่มต้นกระบวนการแรกในกลุ่มอื่นเพื่อให้สามารถส่งสัญญาณไปขัดจังหวะงาน งานเยอะ.
Matteo

1
นี่เป็นวิธีการแก้ไขปัญหาที่ฉันตั้งคำถาม อย่างไรก็ตามอินเทอร์รัปต์หยุดมากกว่าแค่การนับบรรทัดในเวลาน้อยลงตัวอย่างเช่นพวกเขาจะขัดจังหวะการค้นหาที่ยาวนานเช่นกัน ดังนั้นจึงควรใช้วิธีแก้ปัญหาของ @ grawity เนื่องจากจะครอบคลุมการใช้งานอินเตอร์รัปต์ใด ๆ น้อยกว่า ฉันไม่ดีที่ไม่ได้พูดเรื่องนี้อย่างชัดเจนในคำถาม!
Ed McMan

@EmMcMan แน่ใจว่าฉันยังโหวตโซลูชันแรงโน้มถ่วงและฉันยินดีที่จะเรียนรู้สิ่งใหม่ที่อาจเป็นประโยชน์เสมอ
Matteo

0

ในการทำงานกับเอาต์พุตจำนวนมากฉันพบว่ามีประโยชน์มากในการส่งเอาต์พุตไปยังไฟล์และใช้tail -fหรือless +Fดูเช่น:

produce_output > out 2>&1 & less +F out

2>&1ไวยากรณ์ทำให้แน่ใจว่าทั้ง stdout และ stderr ไปที่out--- ลบว่าถ้าคุณเพียงต้องการ stdout ไปไฟล์ ด้วยวิธีนี้คุณสามารถตรวจสอบผลลัพธ์ในรูปแบบต่างๆ (แม้จะมาจากเครื่องอื่น) โดยไม่ต้องยุ่งกับโปรแกรมที่สร้างผลลัพธ์

โปรดทราบว่า2>&1อาจใช้เฉพาะ bash (ฉันไม่แน่ใจ) ตรวจสอบให้แน่ใจว่าคุณมีพื้นที่ดิสก์เพียงพอสำหรับไฟล์เอาต์พุต :-)


หางก็จะแสดงให้คุณเห็นไฟล์เอ็ดระบุว่าเขาจะใช้น้อยโต้ตอบ (เช่นเขามีการค้นหาในแฟ้ม)
มัตเตโอ

2>&1POSIX คือเปลือย>&คือ bashism
user1686

FWIW, 2> & 1 สามารถใช้งานได้กับ Windows XP, 7, 2008, ฯลฯ
jftuga

@ Matteo: ใช่ฉันควรจะใช้less +Fในตัวอย่างของฉัน; ฉันเพิ่งปรับปรุงคำตอบของฉัน
jrennie

1
@Matteo: การนับบรรทัดไม่ใช่ปัญหาเดียวกันกับless +F(เนื่องจากless +Fประมวลผลข้อมูลตามที่สร้างขึ้น) ตัวอย่างที่ผมให้ไม่ได้มีปัญหาเช่นเดียวกับที่เดิม: CTRL + C process_outputจะไม่ยุติ หากไม่มีใครสนใจฟังก์ชั่น 'ติดตาม' ก็สามารถเปิดใช้produce_output > out 2>&1งานless outได้ ปัญหาproduce_output | lessคือถ้ามีสิ่งใดทำลายท่อ (เช่นกดปุ่ม 'q' จากless) produce_outputโดยไม่ตั้งใจแล้วจะตาย (ไม่มีการจัดการ SIGPIPE พิเศษ)
jrennie

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