Bir süre çalışmasına izin verildikten sonra öldürme işlemi


13

Bir grepişlem komutunun çalışmasına veya hayatta kalmasına izin verilen süreyi sınırlamak istiyorum .

Örneğin. Aşağıdakileri yapmak istiyorum:

grep -qsRw -m1 "parameter" /var

Ancak grepkomutu çalıştırmadan önce , grepişlemin ne kadar süre yaşayacağını sınırlamak istiyorum , diyelim ki 30 saniyeden fazla değil.

Bunu nasıl yaparım?

Ve eğer yapabiliyorsa, daha sonra zaman sınırı olmaması için nasıl geri dönebilir veya sıfırlayabilirim.


3
bunu daha önce sormadın mı stackoverflow.com/questions/3061377/…

Hayır bu diğer quastion çünkü orig quastion cevap alamadım Yael

4
@yael: daha önce kullanarak mükemmel bir çözüme timeoutsahipsiniz ve hatta nasıl kurulacağına dair talimatlarınız bile var. Bu cevabı görmezden gelmek ve ardından sorunuzu çoğaltmak kabalıktır.
Paul R

Üzgünüm ama HAYIR Sistemime hiçbir şey yüklemek istemiyorum THX yael

5
@yael: o zaman orijinal sorunuzu bu kısıtlamayı içerecek şekilde güncellemeniz gerekiyor , sadece soruyu çoğaltmak ve tekrar başlamak değil
Paul R

Yanıtlar:


12

Timelimit kullanabilirsiniz , varsayılan ubuntu kullanılabilir veya kendiniz derleyebilirsiniz.

timelimit bir komut yürütür ve belirli bir süre sonra belirli bir sinyal ile ortaya çıkan süreci sonlandırır. İlk önce bir “uyarı” sinyali gönderilir, ardından zaman aşımından sonra, init'in (8) kapanma sırasındaki çalışma biçimine benzer bir “öldürme” sinyali gönderilir.


2
Ubuntus'umda (10.10 masaüstü, 11.04 sunucusu) değil, bu yüzden muhtemelen bir varsayılan değil. Ama hızlı bir şekilde kolayca yakalandı sudo aptitude install timelimit. Kurulduktan sonra harika çalışıyor.
Gün

7

İşte bunun için biraz hackish bash:

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

Temel olarak, arka planda aramayı başlatır, ardından 30 saniye bekleyen bir alt kabuk başlatır ve ardından arama işlemini öldürür. Arama <30s alırsa, işlem zaten ölmüş olacaktır. Zaten ölü olan bir süreci öldürmek harika bir fikir değildir, çünkü başka bir şeyin pideyi yeniden kullanması için çok az şans vardır, ancak böyle bir şey için genellikle iyidir. Son olarak, arama ön plana alınır ve bitinceye veya öldürülene kadar devam eder.


$ nasıl alınır? benim senaryomda $ almak çünkü bu durumda grep gelen? grep'ten ve grep'in dizeyle eşleşip eşleşmediğini doğrulayın? yael

Bunu yapmanın basit bir yolu olduğundan emin değilim. Ayrıca, bu yaklaşım bash'ın iş denetiminin etkin olmadığı bir komut dosyasında çalışmaz. İşi bir senaryoda yapmak için biraz Perl hackery'e başvurmanız gerekebilir. Hmm ...
Walter Mundt

bu soruyu perl'e ulaştırmak mümkün mü? Yael

4

"Tgrep" adında yeni bir dosya oluşturun ve aşağıdakini ekleyin (veya istediğiniz gibi adlandırın):

#!/bin/bash
grep $@ &
PID=$!
sleep 30 && kill $PID 2>/dev/null &
wait $PID
exit 0

Sonra, koş chmod a+x tgrep. Şimdi kullanmak istiyorsanız şunu yazabilirsiniz:

./tgrep -i "results" /home/dan/*txt

Veya $ PATH değişkeninizde (/ home / dan / bin / gibi) bir dizine yerleştirirseniz, yalnızca tgrep olarak kullanabilirsiniz (./ olmadan ve herhangi bir dizinden kullanabilirsiniz) $ PATH değişkeniniz varsa, aksi takdirde ekleyebilirsiniz).

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.