วิธีการหยุดชั่วคราวและดำเนินการต่อกระบวนการอย่าง bash


13

คำถามนี้เป็นคำถามต่อไปนี้: วิธีหยุดชั่วคราวและดำเนินกระบวนการต่อ

ฉันเริ่ม Firefox จากการทุบตีเซสชันใน gnome-terminal

แผนผังกระบวนการมีลักษณะดังนี้:

$ ps -e -o pid,ppid,cmd -H
 1828     1   gnome-terminal
26677  1828     bash
27980 26677       /bin/sh /usr/lib/firefox-3.6.15/firefox
27985 27980         /bin/sh /usr/lib/firefox-3.6.15/run-mozilla.sh /usr/lib/firefox-3.6.15/firefox-bin
27989 27985           /usr/lib/firefox-3.6.15/firefox-bin
28012 27989             /usr/lib/firefox-3.6.15/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so 27989 plugin true

เมื่อฉันCTRL+Zทุบตีมันจะหยุด Firefox เมื่อฉันออกคำสั่งbg(หรือfg) มันจะกลับมาทำงานกับ firefox นี่คือที่คาดไว้

เมื่อฉันออกคำสั่งkill -s SIGTSTP 27980ในเทอร์มินัลอื่นมันจะพิมพ์บรรทัด[1]+ Stopped firefoxในเทอร์มินัลแรก (เหมือนตอนที่ฉันกดCTRL+Z) แต่มันไม่ได้ระงับ firefox ฉันคิดว่ามันจะระงับสคริปต์เชลล์เท่านั้น

เมื่อฉันออกคำสั่งkill -s SIGTSTP 27989(หมายเหตุ PID) ในเทอร์มินัลอื่นมันจะระงับ Firefox อาคารแรกไม่รับทราบสิ่งนี้

ทุบตีระงับต้นไม้กระบวนการทั้งหมดอย่างไร ไม่เพียงแค่สำรวจต้นไม้และ SIGTSTP เด็ก ๆ ทุกคน?



คุณควรเพิ่มคำสั่งpgidของคุณpsเพื่อดูกลุ่มกระบวนการ @geekosaur กำลังพูดถึง
ninjalj

คำตอบ:


17

งานเชลล์อาศัยอยู่ใน "กลุ่มกระบวนการ"; ดูPGRPคอลัมน์ในpsผลลัพธ์เพิ่มเติม สิ่งเหล่านี้ใช้สำหรับการควบคุมงานและเพื่อกำหนดว่าใคร "เป็นเจ้าของ" เทอร์มินัล (ของจริงหรือ pty)

POSIX (นำมาจาก System V) ใช้ ID กระบวนการเชิงลบเพื่อระบุกลุ่มกระบวนการเนื่องจากกลุ่มกระบวนการถูกระบุโดยกระบวนการแรกในกลุ่ม ("ผู้นำกลุ่มกระบวนการ") ดังนั้นคุณจะใช้ในการกำหนดกลุ่มกระบวนการแล้วps kill -s TSTP "-$pgrp"(ลองps -u"$USER" -opid,ppid,pgrp,cmd)

ต้นไม้ในกระบวนการของกลุ่มกระบวนการเริ่มต้นด้วยfirefoxสคริปต์เปิดตัวด้วยbashดังนั้นกลุ่มกระบวนการจะเป็น 27980 kill -s TSTP -27980และคำสั่งจะเป็น

kill -s CONT -- -27980ธรรมชาติเพื่อดำเนินการต่อกลุ่มกระบวนการปัญหา


7
โดยวิธีการที่bashไม่ได้ทำSIGTSTPเมื่อคุณพิมพ์^Z; เนื่องจากfirefoxกลุ่มกระบวนการเป็นกลุ่มกระบวนการปัจจุบันของเทอร์มินัลไดรเวอร์เทอร์มินัล (อวดดีมีระเบียบวินัยในสาย) ส่งSIGTSTPกระบวนการทั้งหมดในกลุ่มกระบวนการนั้น bashเป็นเพียงการwaitpid()ing มัน (และงานอื่น ๆ ) สัญญาณเทอร์มินัลอื่นเช่น^Cและ^\ ทำงานในลักษณะเดียวกัน (meta: SE เกลียด ctrl-backslash .. )
geekosaur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.