นี่ควรเป็นจริงของเชลล์ใด ๆ ที่มีการควบคุมงานซึ่ง (ส่วนใหญ่) คุณสามารถรับสิทธิ์ยกเว้นว่าจะจัดการกับเชลล์โบราณอย่างแท้จริง มันอยู่ในมาตรฐาน POSIXดังนั้นแม้dashสนับสนุนการควบคุมงาน (เมื่อทำงานแบบโต้ตอบหรือด้วย-m)
อินเตอร์แอคที
- Ctrl+ zจะระงับโปรแกรมพื้นหน้าในขณะนี้
bgจะทำให้พื้นหลังโปรแกรมที่ถูกระงับล่าสุด
(ใช้bg %2กับหมายเลขงานซึ่งคุณสามารถตรวจสอบได้jobs)
fg จะทำงานเบื้องหน้าโปรแกรมที่ถูกระงับล่าสุด
ในzshคุณสามารถเขียนการโยงคีย์เพื่อเรียกใช้fgจากพรอมต์ผ่านทางCtrl+ อื่นz:
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
อาจเป็นวิธีที่ฉลาดในการใช้งานโดยปริยายbgเมื่อหยุดทำงานชั่วคราว แต่ดูเหมือนจะไม่ฉลาด อย่างน้อยสำหรับฉันการใช้งานส่วนใหญ่ของฉันCtrl+ zเพราะCtrl+ cไม่สามารถแยกออกได้ ฉันต้องการที่จะทำตามนั้นด้วยเช่นkill %1มากกว่าbgและแน่นอนฉันไม่ต้องการเริ่มต้นที่จะฆ่า! (เหตุผลนี้ยังรวมถึงเหตุผลที่ฉันไม่ใช้การเชื่อมโยงคีย์นี้อีกต่อไป: ถ้าฉันใช้ค้อนทุบกับCtrl+ zเพื่อหยุดกระบวนการสิ่งสุดท้ายที่ฉันต้องการให้ทำคือกลับมาทำงานต่อ!)
ไม่โต้ตอบ
หากคุณอยู่ในอินสแตนซ์เชลล์ที่แตกต่างกัน (หรือผู้ใช้อื่นซึ่งบางครั้งรวมถึงsudoคำสั่ง) คุณอาจจะไม่สามารถใช้หมายเลขงานได้
คุณยังคงสามารถดำเนินการกับกระบวนการอื่นได้เมื่อคุณทราบรหัสกระบวนการ (PID) แล้ว คุณสามารถรับ PID ด้วยpgrep …หรือps aux |grep …(หรือจากเชลล์เดียวกันjobs -lหรือ$!) และจากนั้นคุณสามารถเรียกใช้:
kill -STOP $PID # suspend
kill -CONT $PID # continue (resume)
หากคุณไม่ทราบ ID กระบวนการและไม่กังวลเกี่ยวกับการระงับอินสแตนซ์อื่น ๆ ของกระบวนการตามชื่อคุณสามารถส่งสัญญาณไปยังหนึ่งในเหล่านี้:
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
CONTสัญญาณไปยังโปรแกรมหยุดCtrl+ z(และไม่ได้bg'D) จะกลับมาความคืบหน้า (ในเบื้องหน้า) เช่นเดียวกับถ้าคุณกำลังจะfgมัน
เรื่องข้อผิดพลาดมาตรฐาน
การแก้ไขคำถามนี้ถามเกี่ยวกับข้อผิดพลาดมาตรฐาน:
กระบวนการส่งออกไปยัง stderr ดังนั้นฉันจะออกคำสั่งfg <jobid>ในขณะที่กระบวนการส่งออกไปยังเทอร์มินัลได้อย่างไร
เว้นแต่งานที่มีปัญหาจะมีส่วนประกอบที่มีพื้นหลัง (หรืองานทั้งหมดมีพื้นหลังหรือผ่านkill -CONT) คุณไม่ควรเห็นผลลัพธ์ในขณะที่ถูกระงับ
หากยังคงส่งออกข้อมูล (ไม่ว่าจะเป็นเอาต์พุตมาตรฐานหรือข้อผิดพลาดมาตรฐาน) จะทำให้เทอร์มินัลของคุณมองไม่เห็นอย่างชัดเจน แต่เอาต์พุตทั้งหมดจะถูกละเว้นเนื่องจากไม่ได้เป็นส่วนหนึ่งของอินพุตของคุณ สิ่งนี้อาจทำให้ยากที่จะรู้ว่าคุณไม่ได้พิมพ์ผิด แต่การพิมพ์ (สุ่มสี่สุ่มห้า) fgEnterควรจะพอเพียง (เว้นแต่คุณจะมีงานหลายงานและงานที่มีปัญหาไม่ใช่งานล่าสุดซึ่งในกรณีนี้คุณจะต้องมีตัวระบุงานแน่นอน )
หากคุณต้องการค้นหาตัวอธิบายงานให้ใช้เทอร์มินัลอื่นเพื่อส่งSTOPสัญญาณผ่านวิธีการที่ไม่โต้ตอบด้านบน สิ่งนี้ควรทำให้จอแสดงผลของคุณว่าง (อาจจะกดEnterสองสามครั้งหรือรันclearหรือCtrl+ L) เพื่อให้คุณสามารถเรียกใช้jobsหา descriptor ของงานจากนั้นเรียกใช้fg %Nตำแหน่งที่Nเป็นหมายเลขนั้น