bash
สร้างขึ้นในบริสุทธิ์โดยไม่ต้องcoreutils
ฉันพบว่าโซลูชันนี้ทำงานbash
โดยอาศัยคำสั่งในตัวโดยไม่ต้องเรียกใช้งานจากภายนอก มันทำงานบนระบบที่ไม่ได้ติดตั้งcoreutils ในที่สุด [ 1 ]
YourCommand & read -t 300 ; kill $! # 1st version
YourCommand & read -t 300 || kill $! # 2nd version
คำอธิบาย : ตามปกติเมื่อคุณส่งคำสั่งในพื้นหลังที่มี&
, PID ของมันจะถูกเก็บไว้ในตัวแปรภายใน$!
(ปัจจุบันในรุ่นที่ทันสมัยdash
, csh
, bash
, tcsh
, zsh
... )
จริงๆสิ่งที่ทำให้ความแตกต่างระหว่างเปลือกหอยคือการปรากฏตัวของในตัวคำสั่งread
[ 2 ]-t
และตัวเลือก ในรุ่นที่ 1 หากผู้ใช้จะไม่กรอกข้อมูลในบรรทัดก่อนจำนวนวินาทีที่ระบุคำสั่งจะถูกยกเลิกและรหัสการส่งคืนข้อผิดพลาดจะถูกสร้างขึ้น
-t TIMEOUT สาเหตุที่อ่านเพื่อหมดเวลาและส่งคืนความล้มเหลวหากไม่ได้อ่านบรรทัดที่สมบูรณ์ของอินพุตภายใน TIMEOUT วินาที
รุ่นที่สองทำงานเป็นที่ 1 enterแต่คุณสามารถยกเลิกหมดเวลาการฆ่าเพียงแค่กด
อันที่จริงหรือผู้||
ดำเนินการดำเนินการkill
คำสั่งเฉพาะในกรณีที่read
คำสั่งออกด้วยรหัสกลับแตกต่างจากศูนย์เช่นเมื่อหมดเวลาการหมดอายุ หากคุณกดenterก่อนเวลานั้นมันจะคืนค่า 0 และจะไม่ฆ่าคำสั่งก่อนหน้าของคุณ
วิธีแก้ปัญหา Coreutils [ 1 ]
เมื่อcoreutilsที่มีอยู่ในระบบของคุณและคุณไม่จำเป็นต้องประหยัดเวลาและทรัพยากรที่จะเรียกใช้โปรแกรมภายนอก, timeout
และsleep
และมีทั้งวิธีการที่สมบูรณ์แบบเพื่อบรรลุเป้าหมายของคุณ
timeout
การใช้timeout
ตรงไปตรงมา
ในที่สุดคุณสามารถพิจารณาที่จะใช้-k
ตัวเลือกในการส่งสัญญาณฆ่าเพิ่มเติมถ้าครั้งแรกล้มเหลว
timeout 5m YourCommand # 3rd version
sleep
ด้วยsleep
คุณสามารถใช้จินตนาการของคุณหรือใช้แรงบันดาลใจบาง[ 3 ] โปรดทราบว่าคุณสามารถออกจากคำสั่งของคุณในพื้นหลังหรือเบื้องหน้า (เช่นtop
มักจะต้องอยู่ในเบื้องหน้า)
YourCommand & sleep 5m; kill $! # 4th Background
YourCommand & pid=$! ; (sleep 5m; kill $pid;) & # 5th Background
bash -c '(sleep 5m; kill $$) & exec YourCommand' # 6th Foreground
(cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground
คำอธิบาย
- ในเวอร์ชั่นที่ 4 คุณดำเนินการในพื้นหลัง
YourCommand
แล้วเชลล์ของคุณsleep
เป็นเวลา 5 นาที เมื่อมันจะเสร็จสิ้นกระบวนการพื้นหลังสุดท้าย ( $!
) จะถูกฆ่า คุณหยุดเปลือกของคุณ
-
ในรุ่นที่ 5 แทนคุณดำเนินการในพื้นหลัง
YourCommand
และคุณสามารถจัดเก็บได้ทันทีว่า PID $pid
ในตัวแปร จากนั้นคุณดำเนินการงีบหลับในพื้นหลัง5 นาทีและคำสั่งที่ตามมาที่จะฆ่า PID ที่เก็บไว้ เมื่อคุณส่งคำสั่งกลุ่มนี้ในพื้นหลังคุณจะไม่หยุดเชลล์ คุณต้องจัดเก็บ PID ในตัวแปรเนื่องจาก$!
สามารถอัปเดตค่าได้โดยการดำเนินการในที่สุดของโปรแกรมอื่นในพื้นหลัง ในคำง่ายๆคุณหลีกเลี่ยงความเสี่ยงที่จะฆ่ากระบวนการที่ผิดหรือไม่มีกระบวนการเลย
- ในรุ่นที่ 6 เรียกว่า bash shell ใหม่ที่จะฆ่าตัวตายใน 5 นาที
$$
จากนั้นจะถูกดำเนินการตามคำสั่งของคุณที่ยังคงอยู่เบื้องหน้า
- ในรุ่นที่ 7 จะมีการเรียกใช้ subshell
()
ที่เก็บ PID ของมันในตัวแปร ( cmdpid
) และฆ่าตัวเองด้วย subshell อื่นที่ส่งในการดำเนินการพื้นหลังแล้วรัน YourCommand ในเบื้องหน้า
แน่นอนในแต่ละรุ่นคุณสามารถส่งสัญญาณการฆ่าที่คุณต้องการจากค่าเริ่มต้นไปยังสุดขีด kill -9
เพื่อใช้เมื่อจำเป็นจริงๆเท่านั้น
อ้างอิง
- [ 1 ] The Coreutils
- [ 2 ] The Bash Beginners Guide
- [ 3 ] The BashFAQ