ฉันสามารถ จำกัด กระบวนการให้มีระยะเวลา / รอบการทำงานของ CPU ได้หรือไม่?


16

เรามีสคริปต์ที่ทำงานบนเว็บเซิร์ฟเวอร์ของเราเรียกโดยการกระทำของลูกค้าซึ่งเริ่มต้นกระบวนการ unix เพื่อสร้างแคชไฟล์บางไฟล์ เนื่องจากกระบวนการนี้กระทำกับไฟล์ที่ลูกค้าของเราจัดหามาดังนั้นบางครั้งจึงใช้งานไม่ได้นานจนกระบวนการ PHP ซึ่งวางไข่หมดเวลาหรือใช้เวลา CPU มากจนระบบจะฆ่ามัน

มีคำสั่งใดบ้างที่ฉันสามารถเรียกใช้ซึ่งจะ จำกัด เวลา CPU / รันไทม์ของกระบวนการหรือไม่ ฉันกำลังมองหาคำสั่ง/usr/bin/timeที่ฉันสามารถเรียกใช้คำสั่งนั้นและส่งผ่าน commandline ที่ฉันต้องการให้เรียกใช้และ จำกัด

คำตอบ:


13

นอกจากคำตอบของ Gilles แล้วยังมีเครื่องมือcpulimitที่ทำสิ่งที่คุณต้องการอย่างแน่นอน - รวมถึงการแก้ไขใน runtime นอกจากนี้มันสามารถ จำกัด เฉพาะ CPU / Cores IIRC บางตัวเท่านั้น


12

setrlimit(RLIMIT_CPU, ...)จากภายในโปรแกรมโทร จากเชลล์การโทรulimit -t 42(นี่ไม่ใช่มาตรฐาน แต่ได้รับการสนับสนุนโดยเชลล์ส่วนใหญ่ (รวมถึง bash และ ksh) ในรูปแบบ unix ส่วนใหญ่) สิ่งนี้ทำให้กระบวนการปัจจุบันถูกฆ่าเมื่อมีการใช้เวลา CPU ไม่เกิน N วินาที ข้อ จำกัด นี้สืบทอดโดยกระบวนการลูก สำนวนเปลือกทั่วไปคือ(ulimit -t 42; runaway_process)ถ้าคุณต้องการที่จะสามารถเรียกใช้กระบวนการไม่ จำกัด อื่น ๆ หลังจากนั้นจากเปลือกเดียวกัน

ดูเพิ่มเติมมีวิธี จำกัด ปริมาณหน่วยความจำที่กระบวนการเฉพาะสามารถใช้ใน Unix ได้หรือไม่? . หลักการเดียวกันคุณแค่ จำกัด ทรัพยากรที่แตกต่าง


ปัญหาคือฉันไม่มีซอร์สโค้ดสำหรับโปรแกรมดังนั้นฉันจึงไม่สามารถเพิ่มได้setrlimitและฉันกำลังวางไข่ผ่าน PHP ดังนั้นฉันจึงไม่มีเชลล์ ...
Josh

6
@ Josh: หากคุณกำลังมองหาคล้ายคลึงสร้างเพื่อคุณสามารถใช้time php /cgi/foo.php bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php
Gilles 'หยุดชั่วร้าย'

@Josh apache? ยังผมคิดว่าสิ่งนี้จะเป็นระบบชุดกว้าง ...
xenoterracide

@ xenoterracide ใช่มันเป็น Apache แต่ฉันต้องการ จำกัด เพียงหนึ่งกระบวนการเท่านั้นไม่ใช่กระบวนการ apache ทั้งหมด Oneliner ทุบตีของ Gilles อาจทำงานได้ดี!
Josh

3

คุณยังสามารถใช้timeoutคำสั่งเพื่อป้องกันไม่ให้กระบวนการทำงานนานกว่าระยะเวลาที่ระบุ

ตัวอย่าง

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

ดูหน้าคนหมดเวลาสำหรับรายละเอียดเพิ่มเติม

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