ดูที่นี่
มีสัญญาณสองสัญญาณที่สามารถหยุดการทำงานของกระบวนการได้ หนึ่งคือ "สง่างาม" และหนึ่งคือ "พลัง"
"ความสง่างาม" หนึ่งSIGTSTP
และจุดประสงค์ของมันคือการ "อย่าง" SIGCONT
ขอให้กระบวนการถ้ามันรู้สึกเหมือนมันเพื่อโปรดระงับการดำเนินการจนกว่าจะได้รับ ในกรณีของSIGTSTP
กระบวนการสามารถละเว้น SIGTSTP และดำเนินการต่อไปดังนั้นจึงต้องใช้ความร่วมมือจากโปรแกรมที่ออกแบบมาเพื่อจัดการ SIGTSTP
"แรง" คือSIGSTOP
และวัตถุประสงค์ของมันคือเพื่อระงับเธรดสเปซผู้ใช้ทั้งหมดที่เกี่ยวข้องกับกระบวนการนั้น มันเป็นเพียงเป็นไปไม่ได้สำหรับกระบวนการที่จะไม่สนใจSIGSTOP
มันเป็นมันจะไม่สนใจSIGKILL
(หลังฆ่ากระบวนการอย่างแข็งขัน)
ในการส่งสัญญาณโดยพลการใด ๆ รวมทั้งคนที่กล่าวถึงที่นี่คุณสามารถใช้โปรแกรมเช่นkill
, killall
หรือpkill
; kill(2)
หรือใช้การโทรระบบ ดู manpages ของระบบปฏิบัติการของคุณสำหรับรายละเอียดเกี่ยวกับแพลตฟอร์ม / สถาปัตยกรรม / เวอร์ชันที่ขึ้นกับเวอร์ชันและ errata เกี่ยวกับข้อใดข้อหนึ่งข้างต้น โปรดทราบว่าคำว่า "kill" ในคำสั่งเหล่านี้ทั้งหมดและ syscall เป็นชื่อเรียกที่ไม่ถูกต้อง คำสั่งเหล่านี้ไม่ได้ออกแบบมาเฉพาะเพื่อยุติกระบวนการ พวกเขาสามารถทำได้โดยการส่งสัญญาณบางอย่าง; แต่สัญญาณยังสามารถใช้สำหรับการทำงานอื่น ๆ นอกเหนือจากการยกเลิกกระบวนการ ตัวอย่างเช่นSIGSTOP
หยุดกระบวนการไว้ชั่วคราวและเป็นเพียงหนึ่งในสัญญาณที่สามารถส่งได้ด้วยวิธีนี้
ในการเพิ่มเงื่อนไขของการดำเนินการต่อโดยอัตโนมัติหลังจากผ่านช่วงเวลาหนึ่งไปแล้วคุณจะต้องใช้กระบวนการตรวจสอบบางประเภทที่ยังคงทำงานอยู่และตั้งเวลาเพื่อปลุกกระบวนการตรวจสอบซึ่งจะเป็นการเรียกkill(2)
อีกครั้งและ ส่งSIGCONT
สัญญาณไปยังกระบวนการที่หยุดทำงานเพื่อร้องขอเคอร์เนลเพื่อดำเนินการต่อ โปรดทราบว่า Linux มีกลไกการจับเวลาหลายอย่างที่มีความแม่นยำและความแม่นยำหลายระดับ นอกจากนี้หากระบบของคุณไม่ว่างมากกระบวนการตรวจสอบของคุณอาจไม่ทำงานจนกว่าจะถึงเวลาที่กำหนดหลังจากหมดเวลาดังนั้นการปลุกอาจล่าช้า
หากคุณขึ้นอยู่กับความแม่นยำถูกต้องมากของการระงับและการเริ่มต้นใหม่ของกระบวนการระงับคุณอาจจำเป็นต้องเรียกใช้โปรแกรมตรวจสอบของคุณมีสิทธิ์ในเวลาจริง (ดูmanpage นี้ในsched_setscheduler(2)
ข้อมูลเกี่ยวกับการดำเนินการของคุณแบบ real-time) นอกจากนี้คุณยังสามารถใช้ความละเอียดสูงตัวจับเวลาคุณลักษณะของลินุกซ์ (ซึ่งจะใช้ได้เฉพาะเมื่อฮาร์ดแวร์ของคุณให้การสนับสนุนสำหรับพวกเขา) ในการรวมกันด้วยการตั้งเวลาแบบ real-time เพื่อให้ได้มากที่ถูกต้องแม่นยำย่อยมิลลิวินาทีกับระยะเวลาแล้ว ปลุกและส่งสัญญาณเพื่อให้กระบวนการกลับมาทำงานได้อย่างรวดเร็ว
คุณไม่ได้ระบุว่าคุณต้องการใช้เทคโนโลยีใดในการดำเนินการนี้ อย่างน้อยที่สุดคุณจะต้องใช้สคริปต์ทุบตีอย่างน้อยถึงแม้ว่าคุณจะไม่สามารถทำให้ได้จังหวะที่ดี นี่คือ "สคริปต์" ทุบตี (ยังไม่ทดลองดังนั้นโปรดระวัง) ซึ่งเป็นเพียงหลักฐานของแนวคิดการสืบค้นของคุณ หากคุณต้องการเวลาที่แม่นยำคุณจะต้องเขียนโปรแกรมอาจเป็นภาษา C / C ++ หรือภาษาพื้นเมืองอื่นและใช้การตั้งเวลาและ hrtimers แบบเรียลไทม์
#!/bin/bash
#This is the process you want to suspend.
screen -mdS child bash -c "cat /dev/urandom | base64"
#This is the process ID of the child process
THEPID=$(screen -list | grep child | cut -f1 -d'.' | sed 's/\W//g')
#Send SIGSTOP to the child process.
kill -SIGSTOP ${THEPID}
#Now it is suspended. This process will sleep for 10 seconds asynchronously, then resume the process.
screen -mdS monitor bash -c "sleep 10; kill -SIGCONT ${THEPID}"
โปรดทราบว่าสคริปต์จะสิ้นสุดและสคริปต์ควบคุมจะสิ้นสุดลง แต่เนื่องจากการscreen
ควบคุมกระบวนการตรวจสอบสคริปต์จะยังคงทำงานในพื้นหลังเป็นเวลา 10 วินาที (ขึ้นอยู่กับอาร์กิวเมนต์ที่ส่งผ่านไปsleep
) แล้วตื่นขึ้นมาและดำเนินการต่อกระบวนการลูก แต่จะนานหลังจากสคริปต์ควบคุมสิ้นสุดลง ถ้าคุณต้องการซิงโครนัสรอเวลาที่จะผ่านไปเพียงแค่ละเว้นการโทรครั้งที่สองไปscreen
แล้วทำการโค้ด sleep และ kill ลงในสคริปต์ควบคุม
คุณสามารถทดสอบว่ากระบวนการนั้นจริงแล้วถูกระงับโดยการเรียกใช้
screen -rS child
หลังจากที่คุณเริ่มสคริปต์นี้ คุณจะไม่เห็นอะไรเลยบนคอนโซล จากนั้นหลังจากตัวจับเวลาหมดอายุ (10 วินาที) มันจะทำให้หน้าจอของคุณเต็มไปด้วยข้อมูล base64 (ตัวอักษรแบบสุ่มจาก 0-9 และ AF) กด Ctrl + C เพื่อออก