Bisakah saya membatasi suatu proses untuk sejumlah waktu / siklus CPU?

16

Kami memiliki skrip yang berjalan di server web kami, dipicu oleh tindakan pelanggan, yang memulai proses unix untuk menghasilkan beberapa file cache. Karena proses ini bertindak atas file yang disediakan oleh pelanggan kami, kadang-kadang terjadi kesalahan, berjalan sangat lama sehingga proses PHP yang memunculkannya habis atau menggunakan begitu banyak waktu CPU sehingga sysadmin akan membunuhnya.

Apakah ada perintah yang bisa saya jalankan yang akan membatasi waktu CPU / runtime proses? Saya mencari perintah seperti /usr/bin/time, di mana saya bisa menjalankan perintah itu dan memberikannya baris perintah yang saya ingin jalankan dan batasi.

Josh
sumber

Jawaban:

13

Selain jawaban Gilles ada alat cpulimit yang melakukan persis apa yang Anda inginkan - termasuk modifing di runtime. Selain itu dapat membatasi hanya untuk CPU / Cores IIRC tertentu.

Maciej Piechotka
sumber
12

Dari dalam suatu program, panggil setrlimit(RLIMIT_CPU, ...). Dari shell, panggil ulimit -t 42(ini bukan standar tetapi didukung oleh sebagian besar shell (termasuk bash dan ksh) pada sebagian besar varian unix). Ini menyebabkan proses saat ini untuk dimatikan setelah menggunakan N detik waktu CPU. Keterbatasan ini diwarisi oleh proses anak. Idi shell umum adalah (ulimit -t 42; runaway_process)jika Anda ingin dapat menjalankan proses tak terbatas lainnya setelah itu dari shell yang sama.

Lihat juga Apakah ada cara untuk membatasi jumlah memori yang dapat digunakan proses tertentu di Unix? . Prinsipnya sama, Anda hanya membatasi sumber daya yang berbeda.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Masalahnya adalah, saya tidak memiliki kode sumber untuk program ini sehingga saya tidak dapat menambahkan setrlimitdan saya memunculkannya melalui PHP jadi saya tidak memiliki shell ...
Josh
6
@Josh: Jika Anda mencari konstruksi yang analog dengan time php /cgi/foo.php, Anda dapat menggunakan bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php.
Gilles 'SO- stop being evil'
@ Ya apache? juga saya pikir hal ini dapat mengatur sistem lebar ...
xenoterracide
@ xenoterracide ya itu Apache, tapi saya hanya ingin membatasi proses yang satu ini, tidak semua proses apache. Oneliner pesta Gilles mungkin berhasil!
Josh
3

Anda juga dapat menggunakan timeoutperintah untuk memblokir proses agar tidak lebih lama dari jumlah waktu yang ditentukan.

contoh

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

Lihat halaman manual batas waktu untuk perincian lebih lanjut.

slm
sumber