นี่ควรเป็นจริงของเชลล์ใด ๆ ที่มีการควบคุมงานซึ่ง (ส่วนใหญ่) คุณสามารถรับสิทธิ์ยกเว้นว่าจะจัดการกับเชลล์โบราณอย่างแท้จริง มันอยู่ในมาตรฐาน 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
) คุณไม่ควรเห็นผลลัพธ์ในขณะที่ถูกระงับ
หากยังคงส่งออกข้อมูล (ไม่ว่าจะเป็นเอาต์พุตมาตรฐานหรือข้อผิดพลาดมาตรฐาน) จะทำให้เทอร์มินัลของคุณมองไม่เห็นอย่างชัดเจน แต่เอาต์พุตทั้งหมดจะถูกละเว้นเนื่องจากไม่ได้เป็นส่วนหนึ่งของอินพุตของคุณ สิ่งนี้อาจทำให้ยากที่จะรู้ว่าคุณไม่ได้พิมพ์ผิด แต่การพิมพ์ (สุ่มสี่สุ่มห้า) fg
Enterควรจะพอเพียง (เว้นแต่คุณจะมีงานหลายงานและงานที่มีปัญหาไม่ใช่งานล่าสุดซึ่งในกรณีนี้คุณจะต้องมีตัวระบุงานแน่นอน )
หากคุณต้องการค้นหาตัวอธิบายงานให้ใช้เทอร์มินัลอื่นเพื่อส่งSTOP
สัญญาณผ่านวิธีการที่ไม่โต้ตอบด้านบน สิ่งนี้ควรทำให้จอแสดงผลของคุณว่าง (อาจจะกดEnterสองสามครั้งหรือรันclear
หรือCtrl+ L) เพื่อให้คุณสามารถเรียกใช้jobs
หา descriptor ของงานจากนั้นเรียกใช้fg %N
ตำแหน่งที่N
เป็นหมายเลขนั้น