ความแตกต่างระหว่าง Ctrl-Z และ kill -STOP คืออะไร


14

เมื่อฉันเรียกใช้คำสั่ง ( makeในโครงการขนาดใหญ่) จากเชลล์ฉันสามารถพิมพ์ Ctrl-Z เพื่อหยุดกระบวนการและกลับไปที่เชลล์ ต่อจากนั้นฉันสามารถเรียกใช้fgเพื่อดำเนินการตามกระบวนการต่อไป

ฉันกำลังพยายามเขียนเชลล์สคริปต์เพื่อทำสิ่งนี้โดยอัตโนมัติ (โดยเฉพาะเพื่อตรวจสอบอุณหภูมิ CPU ของฉันทุกสองสามวินาทีและหยุดกระบวนการถ้ามันร้อนเกินไปเนื่องจากคอมพิวเตอร์ของฉันมีแนวโน้มที่จะร้อนเกินไป) ความพยายามครั้งแรกของฉันทำงานเช่นนี้ (ลดความซับซ้อน):

make &
subpid="$!"

sleep 2
# If the CPU temperature is too high...
kill -STOP "$subpid"

sleep 2
# If the CPU temperature has dropped to safe levels...
kill -CONT "$subpid"

wait "$subpid"

น่าเสียดายที่นี่ใช้งานไม่ได้ การส่ง SIGSTOP ไปยังกระบวนการไม่ได้หยุดชั่วคราว (ดังที่เห็นได้ชัดจากการดำเนินการส่งเอาต์พุตไปยังเทอร์มินัล) ฉันวิ่งไปmake &ที่บรรทัดคำสั่งส่ง SIGSTOP และตรวจสอบสถานะกระบวนการด้วยps; มันถูกระบุว่าหยุด (และเริ่มอีกครั้งเมื่อฉันส่ง SIGCONT) แต่มันก็ยังคงพ่นออกมาและทำให้อุณหภูมิแกนของฉันเพิ่มขึ้น! การหยุดด้วย Ctrl-Z ไม่เคยมีปัญหานี้ แต่ฉันไม่รู้วิธีการทำในสคริปต์

อะไรทำให้ Ctrl-Z แตกต่างจากkill -STOPและฉันจะทำให้พฤติกรรมของอดีตในเชลล์สคริปต์ได้อย่างไร


และใช่makeจะถูกเรียกใช้ซ้ำ อันที่จริงฉันคิดว่ามันลึกลงไปหลายระดับ
Taymon

คำตอบ:


12

อะไรทำให้ Ctrl-Z แตกต่างจากkill -STOPและฉันจะทำให้พฤติกรรมของอดีตในเชลล์สคริปต์ได้อย่างไร

CTRL-Zโดยปกติแล้วจะส่ง SIGTSTP (ซึ่งสามารถบล็อกได้) และ - นอกเหนือจากสิ่งอื่น ๆ - เชลล์มักรีเซ็ต tty เป็นสถานะที่บันทึกไว้ก่อนหน้านี้ในโอกาสเหล่านี้ อย่างไรก็ตามที่สำคัญกลุ่มกระบวนการเทอร์มินัลการควบคุมถูกตั้งค่าเป็น PID ของเชลล์ (และจากนั้นเป็น PID ของงานที่ดำเนินการต่อด้วยfg)

กลับไปที่ปัญหาดั้งเดิมของคุณ: การใช้การปรับความถี่ตามอุณหภูมิเช่นCpufreqdอาจเป็นค้อนที่ดีกว่าสำหรับเล็บของคุณ


4

คุณไม่ต้องการหยุดmakeกระบวนการ คุณต้องการหยุดmakeกระบวนการและกระบวนการลูกทั้งหมด ฉันเดิมพันทำให้ถูกเรียกซ้ำ

คุณอาจจะลองset -mแล้วใช้แทน%1"$subpid"

set -mช่วยให้ "การควบคุมงาน" ซึ่งจะปิดโดยสคริปต์ภายในเริ่มต้น ฉันคิดว่ามันควรจะทำงานสำหรับกรณีการใช้งานของคุณ แต่คนดูเหมือนจะคิดว่ามันเป็นความคิดที่ดีในทั่วไป


4

คุณสามารถส่งสัญญาณไปยังกระบวนการทั้งหมดในกลุ่มกระบวนการถ้าคุณระบุค่า PID เชิงลบ - PGID ของผู้นำเซสชัน

kill -STOP -"$subpid"

หมายเหตุ: setsid makeในการเรียกใช้โปรแกรมในการใช้งานเซสชั่นใหม่ แต่ในกรณีของคุณฉันคิดว่ามันไม่จำเป็น อย่างไรก็ตามหากมีการเรียกใช้ซ้ำแล้วซ้ำอีกแต่ละครั้งของการทำอาจเป็นผู้นำของตัวเอง (ฉันไม่แน่ใจเกี่ยวกับเรื่องนั้น)

ตัวเลือกอื่นอาจใช้killall:

killall -STOP make

ความแตกต่างระหว่าง Ctrl + Z และ kill -STOP:

  • Ctrl-Z ส่ง TSTP ซึ่งสามารถบล็อกได้
  • ไม่สามารถบล็อก STOP ได้

วิธี PGID ไม่ทำงานและสร้างบรรทัดผลลัพธ์ต่อไปนี้: /usr/local/bin/myscript: line 38: kill: (-10202) - No such process. กระบวนการพื้นหลังยังคงทำงานต่อไป ฉันไม่คิดว่าkillallวิธีการที่จะทำงานเพราะบางส่วนของกระบวนการย่อยปรากฏจะเป็นมากกว่าsh make
Taymon

ดูเหมือนว่ากระบวนการที่คุณส่งสัญญาณไปเสร็จสิ้นแล้ว กระบวนการย่อยที่ชื่อว่า sh ถูกสร้างโดยการสร้าง ในกรณีที่คุณทำและกระบวนการย่อยจำนวนมากที่ดีที่สุดน่าจะเป็นการรับ PID ของเด็กทุกคนและหยุดพวกเขาทั้งหมด
Jurij

มันจบลงด้วยการทำงานเมื่อฉันทำมันด้วยตนเองจากเชลล์ แต่ไม่ใช่ในเชลล์สคริปต์ ฉันคิดว่านี่เป็นเพราะเมื่อฉันทำด้วยตนเอง root PID (ซึ่งคนอื่นสืบทอด PGID ของพวกเขาจาก) เป็นmakeคำสั่งแรกแต่เมื่อฉันทำมันจากสคริปต์ root PID มาจากเชลล์สคริปต์เอง .
Taymon

1

Ctrl+ Cจะใช้ในการฆ่ากระบวนการที่มีสัญญาณSIGINTโดยคำอื่น ๆ ก็เป็นสุภาพฆ่า

Ctrl+ Z ใช้เพื่อหยุดกระบวนการโดยส่งสัญญาณSIGSTPซึ่งเป็นเหมือนสัญญาณสลีปที่สามารถเลิกทำได้และกระบวนการสามารถกลับมาทำงานอีกครั้งได้

แต่เมื่อกระบวนการที่ถูกระงับเราสามารถดำเนินการได้อีกครั้งโดยfg (ประวัติการทำงานในเบื้องหน้า)และbg (ประวัติการทำงานในพื้นหลัง)แต่ฉันไม่สามารถกลับมาเป็นกระบวนการที่ถูกฆ่าตายที่เป็นความแตกต่างระหว่างการใช้Ctrl+ C& +CtrlZ

วิธีดูกระบวนการที่ถูกระงับ

เมื่อคุณมีคำสั่งที่ถูกระงับหลายรายการเพื่อให้พวกเขาอยู่ในรายการคุณใช้jobsคำสั่งและผลลัพธ์จะเป็น:

[1]-  Stopped                 cat
[2]+  Stopped                 vi

จะฆ่ากระบวนการที่ถูกระงับเป็นเบื้องหลังได้อย่างไร

โดยใช้killคำสั่ง:

kill %nที่nคือจำนวนงาน (หนึ่งในวงเล็บมาจากการส่งออกงาน) kill %1ดังนั้นฉันต้องการที่จะฆ่าแมว:

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