วางงานในพื้นหลังโดยไม่หยุด


9

สมมติว่าคุณเริ่มงานเช่นนี้

foo

และจากนั้นความปรารถนาที่คุณต้องการวางไว้ในพื้นหลัง พิมพ์ดีดCtrl+ Zแล้วbgไม่หลอกลวง แต่จะหยุดfooระหว่างCtrl+ และZ bgฉันจะวาง foo ไว้ในพื้นหลังโดยไม่หยุดก่อนได้อย่างไร


7
กรณีการใช้งานคืออะไร? ทำไมมันเป็นปัญหาที่กระบวนการค้างในช่วงเวลาสั้น ๆ ?
l0b0

คำตอบ:


4

ในทางเทคนิคfooแล้วทำงานในพื้นหลัง คุณสามารถเริ่มเซสชันเทอร์มินัลที่สองและเซสชันแรกจะยังคงทำงานต่อไปfooในขณะที่คุณทำสิ่งอื่น ๆ

ใน X สิ่งนี้เกี่ยวข้องกับการเริ่มต้นแอปพลิเคชั่นเทอร์มินัลที่สองหรือเปิดแท็บอื่นหากเทอร์มินัลอีมูเลเตอร์ของคุณมีคุณสมบัติดังกล่าว

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

หากคุณใช้เทอร์มินัลมัลติเพล็กเซอร์เช่นscreenหรือtmuxคุณสามารถเริ่มเซสชันอื่นภายในเซสชันได้ ตัวอย่างเช่นในหน้าจอสิ่งนี้ทำได้โดยใช้Ctrl+ Aตามด้วยCtrl+ Cทันที หากต้องการสลับระหว่างพวกเขาให้ใช้ Ca Cn และ Ca Cp เพื่อย้อนกลับไปมาระหว่างเทอร์มินัลเซสชัน


นั่นคือมันเป็นไปไม่ได้ในการทุบตี
user877329

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

@ WumpusQ.Wumbley จุดคำตอบของฉันคือระบบส่วนใหญ่ (ทั้งหมด?) ที่สามารถใช้ bash นั้นเป็นแบบมัลติทาสกิ้งตามธรรมชาติ ในระบบดังกล่าวแม้ว่ากระบวนการมีการพูดโฟกัสอินพุตไม่มีอะไรที่ "เบื้องหน้า" เกี่ยวกับกระบวนการตัวเอง; foo ตัวเอง (ขาดการตรวจสอบเฉพาะที่ฉันคาดเดาในป่าอยู่ที่ไหนสักแห่งระหว่างหายากและไม่มีอยู่) ไม่สนใจว่าจะทำงานในหน้าต่างด้านบนสุดหรือแม้ว่าจะมีบางสิ่งที่แสดงผลของมัน
CVn

1
ประเด็นของฉันคือเมื่อคำถามกล่าวถึงคำว่า "พื้นหลัง" และ "งาน" โดยเฉพาะ - ซึ่งทั้งสองคำนี้เป็นศัพท์ทางเทคนิคที่มีความหมายที่กำหนดโดยกรอบกระบวนการกลุ่ม POSIX - รวมถึงกลไกของ Ctrl-Z และ bg ซึ่งทั้งสองอย่าง ดำเนินการกับกลุ่มกระบวนการ - และคำตอบของคุณไม่แนะนำให้ใช้ฟังก์ชันกลุ่มกระบวนการเลยและคุณใช้คำว่า "พื้นหลัง" ในวิธีที่ไม่ตรงกับคำจำกัดความที่แท้จริงของมัน - คุณไม่เหมาะสมกับคำตอบของคำถาม และเพื่อเริ่มต้นด้วย "เทคนิคfooทำงานในพื้นหลัง" ... เพียงแค่ ... ไม่ทางเทคนิค

@ WumpusQ.Wumbley อย่างใดฉันไม่คิดว่า OP อ่านมาตรฐาน POSIX และคิดว่า "อืมฉันอยากจะใช้สิ่งนี้ แต่ฉันเริ่มแล้วfooดังนั้นตอนนี้ฉันจะทำอย่างไร?" หากคุณรู้สึกว่าคำตอบนี้ (หรือคำตอบอื่น ๆ ) นั้นไม่มีประโยชน์ในการตอบคำถามฉันขอแนะนำให้คุณใช้สิทธิ์ในการลงคะแนนของคุณรวมถึงออกจากคำตอบของคุณเองเพื่อตอบคำถามจากสิ่งที่คุณรู้สึกว่าเป็นมุมที่ถูกต้องมากกว่า การโต้แย้งเกี่ยวกับหนึ่งในคำตอบที่เหลืออยู่ในคำถาม บางทีคุณอาจจะรู้สึกว่าสำหรับคำตอบเช่น l0b0 จะดี แต่คำตอบข้อเสนอของฉันมีวิธีที่จะทำอย่างน้อยประมาณสิ่งที่ OP ต้องการ
CVn

3

การเพิ่ม&เครื่องหมายหลังจากคำสั่ง ( foo &) จะทำให้พื้นหลังนั้นทันที แต่ฉันเชื่อว่าไม่มีวิธีใดในการกำหนดค่าเทอร์มินัล / เชลล์เพื่อให้พื้นหลังบางอย่างทันทีที่พื้นหน้า


3

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

ฉันมีการกำหนดค่า zshที่ฉันสามารถกดCtrl+ Zสองครั้งติดต่อกันอย่างรวดเร็ว; การกดครั้งแรกจะหยุดกระบวนการชั่วคราวและการกดครั้งที่สองจะดำเนินการต่อในพื้นหลัง ฉันไม่รู้วิธีพอร์ตเพื่อทุบตี

หากคุณกำลังทำงานในเทอร์มินัลอีมูเลเตอร์ที่ช่วยให้คุณสามารถฉีดการกดแป้นได้คุณสามารถฉีด^Zbg^M(ใช้^เครื่องหมายสำหรับอักขระควบคุม) ตัวอย่างเช่นด้วยเทอร์มินัลอีมูเลเตอร์ X11 ให้รันxdotool --window 1234 Ctrl_L+Z b g Returnโดยที่ 1234 คือ ID หน้าต่างของเทอร์มินัลอีมูเลเตอร์ ด้วย Screen ให้รันscreen -S foo -p 12 -X stuff $'\032bg\r'โดยที่fooชื่อของเซสชันหน้าจอและ12เป็น ID หน้าต่าง


2

หากการพิมพ์ของคุณไม่เร็วพอสำหรับเคสให้เรียกใช้kill -s SIGSTOP 1023 && kill -s SIGCONT 1023จากเชลล์อื่นให้สมมติว่า 1023 เป็น PID เป้าหมาย

การปฏิเสธความรับผิด: ตามที่Ruslanอาจรู้ว่าลำดับที่เริ่มต้นใหม่ของงานจริงอย่างรวดเร็วbashจึงไม่สังเกตเห็นมัน


มันจะวางงานเป็นพื้นหลังได้อย่างไร?
Ruslan

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