Linux'ta bir programın çalışma süresi nasıl kısıtlanır?


10

Yapmam gereken birkaç simülasyon var, her biri çağrılıyor python simulate.py <parameter list>. Bu simülasyonlarla ilgili sorun, bazılarının bırakmadan asılı kalmasıdır, bu da onları basit bir komut dosyasıyla toplu olarak çalıştırmamı engeller.

İhtiyacım olan şey, belirli bir süre sonra işlemi otomatik olarak (tercihen neredeyse Ctrl + C tuşlarına basarak öldürebilir, ancak basit öldürmenin de yapacağını düşünüyorum) "çalışma zamanı kısıtlaması" komutunun bir şeklidir. süreç kendi kendine zarif bir şekilde sona ermedi.

Tabi ki böyle komut dosyası kendim yazabilir, ama ben ile harcama saat tekerleği yeniden icat etmek zorunda kalmamak için birisi, benden önce zaten yapmış şüpheli ps, timeve bash kılavuzları.

Yanıtlar:


15

Potansiyel çözüm # 1

timeoutKomutunu kullanın :

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

Eğer bir süre sonra durmadıysa, timeoutkomuta da bir bekçi koyabilirsiniz kill.

$ date
Mon May  6 07:40:40 EDT 2013
$ timeout -k 20 5 sleep 100
$ date
Mon May  6 07:40:48 EDT 2013

Bu, işlem sleep 100durduktan sonra 20 saniye kadar bekler , eğer hala çalışıyorsa, timeoutbir killsinyal gönderir.

Potansiyel çözüm # 2

Alternatif bir yol olsa da, daha riskli bir yöntem aşağıdaki gibi olacaktır:

./myProgram &
sleep 1
kill $! 2>/dev/null && echo "myProgram didn't finish"

Bu tekniği Stack Overflow'da şu soruda bulabilirsiniz: Linux'ta bir programın çalışma süresini sınırlama . Özellikle bu cevap .

NOT: @mattdm tarafından bırakılan bir yorum başına, yukarıdaki yöntem, işleminizden bu yana yeni bir işlem başlatılmadığı varsayılarak riskli olabilir. Bu yüzden yeni PID atanmadı. Bu göz önüne alındığında, bu yaklaşım muhtemelen kullanılmamalıdır, ancak burada sadece soruna genel bir yaklaşım için referans olarak kullanılmaktadır. timeoutYöntem 2 iyi bir seçenektir.


Ancak, komut dosyasının her zaman bu kadar süreceği garanti edilecektir. Benim durumumda 1 saniye değil, 15 dakika.
Adam Ryczkowski

Ama bu soruda bulunan diğer çözüm tam olarak ihtiyacım olan şey olmalı. Teşekkürler!
Adam Ryczkowski

2
Diyelim ki myProgram daha kısa sürede bitirelim sleep(amaç, izin verilen maksimum çalışma süresini ayarlamak olduğundan mantıksız bir varsayım değil ). Daha sonra, mevcut olmayan bir PID'ye (gerçek zarar verilmez) veya sistemdeki herhangi bir rastgele işleme (potansiyel olarak ölümcül) bir sinyal gönderirsiniz .
CVn

1
@ MichaelKjörling, geri dönüş için teşekkürler. OP'nin de bıraktığı aynı yorum başına cevabımı güncelledim. timeoutKomut tam olarak aradığı şeyi yapıyor ve OP'nin yorumlarıma cevap vermesini bekliyor gibi görünüyor .
slm

@slm timeoutihtiyacım olan çözüm olmalı. Şu anda test ediyorum
Adam Ryczkowski

4

Ben daha biraz daha iyi bir şey buldum timeout: timelimit.

Birkaç avantajı vardır; birincisi, kullanıcının "Ctrl + C" tuşlarına basarak yürütmeyi el ile iptal edebilmesidir.

timelimitProgram Debian depoda mevcuttur.


1
S / b timelimit ve zaman aşımı farklarını anlamaya çalışmak. zaman aşımı Ctrl + C ile durdurulabilir. Diğer avantajları nelerdir?
slm

Zaman aşımı yapamaz. Mint 14 kullanıyorum (Ubuntu Quantal tabanlı).
Adam Ryczkowski

3

Cpu zamanını ve diğer şeyleri ulimitcpu zamanı için özellikle ayarlayabilirsiniz :

$ ulimit -t 60      # limit to 60 seconds
$ program

Bu U&L Soru ve Cevaplarına bakın: unix.stackexchange.com/a/4666/7453 . @Gilles, ulimit'in bu amaç için kullanımına iyi bir genel bakış sağlar.
slm

0

Bash adlı bir değişken kullanır $BASHPID böyle bir durumda kullanılabileceği , örneğin:

#!/bin/bash
do_face() {
    local parent=$1
    echo $BASHPID > pid
    sleep 10
    echo "Killing parent $parent"
    kill $parent
}

ME=$BASHPID
eval $(echo "do_face $ME &")
sleep 20 && kill $(cat pid) && echo "killed child $(cat pid)"
exit 1

Sen çağrısında argüman değiştirebilir sleepiçinde do_face()hiç 100yerine 10ve çocuğun işleri yapmayı çok uzun sürdüğünde ne olduğunu görün. Sadece uyku çağrısını değiştirindo_face() çalıştırılabilir çok uzun sürerse komut dosyası onu öldürür, 20saniye bu örnekte sınırlayıcı değerdir. Parametreler, çağrılacak basit bir komut dosyası haline gelecek ve toplu olarak veya başka bir komut dosyası tarafından çağrılabilecek şekilde uygulanabilir. Her eşzamanlı işlem için pid dosyalarının işlenmesi, belki de farklı alt dizinler kullanılması gereken bir konudur ...

Not: GNU Linux sleep, sleep 0.1saniyenin onda biri kadar uyumak gibi kayan nokta argümanları alabilir .

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.