Bir işlemi belirli bir süre / CPU döngüsüyle sınırlandırabilir miyim?


16

Web sunucularımızda çalışan, müşteri işlemi tarafından tetiklenen ve bazı önbellek dosyaları oluşturmak için bir unix işlemi başlatan bir komut dosyamız var. Bu işlem müşterimiz tarafından sağlanan dosyalar üzerinde etkili olduğundan, bazen yanlış davranır, bu kadar uzun süre çalışır ve zaman aşımına uğrayan PHP süreci veya bir sysadmin'in onu öldüreceği kadar çok CPU zamanı kullanır.

İşlemin CPU zamanını / çalışma zamanını sınırlandırabileceğim herhangi bir komut var mı? /usr/bin/timeBu komutu çalıştırabileceğim ve çalıştırmasını ve sınırlamasını istediğim komut satırını iletebileceğim gibi bir komut arıyorum .

Yanıtlar:


13

Gilles yanı sıra tam olarak ne istediğinizi yapan cpulimit aracı var - çalışma zamanında değiştirmek dahil. Ayrıca, yalnızca belirli CPU'lar / Çekirdekler IIRC ile sınırlanabilir.


12

Bir programın içinden arayın setrlimit(RLIMIT_CPU, ...). Kabuktan çağırın ulimit -t 42(bu standart değildir, ancak çoğu unix varyantındaki çoğu kabuk (bash ve ksh dahil) tarafından desteklenir). Bu işlem, N saniyelik CPU süresi kullandığında geçerli işlemin öldürülmesine neden olur. Sınırlama, alt süreçler tarafından miras alınır. Ortak bir kabuk deyimi, (ulimit -t 42; runaway_process)daha sonra aynı kabuktan diğer sınırsız süreçleri çalıştırmak istiyorsanız.

Ayrıca bkz. Belirli bir işlemin Unix'te kullanabileceği bellek miktarını sınırlamanın bir yolu var mı? . İlke aynı, sadece farklı bir kaynağı sınırlandırıyorsunuz.


Sorun şu ki, programın kaynak koduna sahip değilim, bu yüzden ekleyemiyorum setrlimitve PHP ile yumurtluyorum, bu yüzden bir kabuğum yok ...
Josh

6
@Josh: Buna benzer bir yapı arıyorsanız time php /cgi/foo.php, kullanabilirsiniz bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php.
Gilles 'SO- kötü olmayı bırak'

@ Aptal mı? Ayrıca bu şeyler sistem geniş ayarlanabilir ...
xenoterracide

@xenoterracide evet bu Apache, ama tüm bu apache süreçlerini değil, sadece bu süreci sınırlamak istiyorum. Gilles'in bash oneliner'i harika olabilir!
Josh

3

timeoutKomutu, bir işlemin belirli bir süreden daha uzun süre çalışmasını engellemek için de kullanabilirsiniz .

misal

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

Daha fazla bilgi için zaman aşımı man sayfasına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.