Zabij proces, gdy może on działać przez pewien czas

13

Chcę ograniczyć czas, w którym greppolecenie procesu może działać lub być aktywne.

Na przykład. Chcę wykonać następujące czynności:

grep -qsRw -m1 "parameter" /var

Ale przed uruchomieniem greppolecenia chcę ograniczyć czas trwania grepprocesu, powiedzmy nie dłużej niż 30 sekund.

Jak mam to zrobic?

A jeśli to możliwe, w jaki sposób mogę wrócić lub zresetować, aby nie mieć później limitu czasu.

Yael
źródło
3
nie pytałeś już o to? stackoverflow.com/questions/3061377/...
Nie ma tego drugiego pytania, ponieważ nie otrzymuję odpowiedzi na pytanie oryginalne Yael
4
@yael: masz już doskonale dobre rozwiązanie timeout, a nawet masz instrukcje, jak je zainstalować. Nieuprzejmie jest zignorować tę odpowiedź, a następnie powielić swoje pytanie.
Paul R
przepraszam ale NIE Nie chcę niczego instalować w moim systemie THX yael
5
@yael: wtedy musisz zaktualizować swoje pierwotne pytanie, aby uwzględnić to ograniczenie , NIE powielaj pytania i zacznij od nowa
Paul R

Odpowiedzi:

12

Możesz użyć timelimit , jest on dostępny w domyślnym ubuntu lub możesz go skompilować samodzielnie.

timelimit wykonuje polecenie i kończy odradzany proces po określonym czasie z danym sygnałem. Najpierw wysyłany jest sygnał „ostrzegawczy”, a następnie po upływie limitu czasu sygnał „zabijania”, podobny do sposobu działania init (8) przy wyłączaniu.

feniix
źródło
2
Nie ma go w moim Ubuntusie (komputer 10.10, serwer 11.04), więc prawdopodobnie nie jest domyślny. Ale łatwo złapać szybko sudo aptitude install timelimit. Działa świetnie po zainstalowaniu.
Dzień
7

Oto trochę lekko hackish bash za to:

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

Zasadniczo rozpoczyna wyszukiwanie w tle, a następnie uruchamia podpowłokę, która czeka 30 sekund, a następnie zabija proces wyszukiwania. Jeśli wyszukiwanie zajmie mniej niż 30 sekund, proces będzie już martwy. Zabicie procesu, który już jest martwy, nie jest świetnym pomysłem, ponieważ istnieje bardzo mała szansa, że ​​coś jeszcze wykorzysta pid, ale w przypadku czegoś takiego ogólnie jest w porządku. Na koniec wyszukiwanie jest odkładane z powrotem na pierwszy plan i będzie trwało, dopóki się nie zakończy lub nie zostanie zabite.

Walter Mundt
źródło
jak zdobyć $? od grep w tym przypadku, ponieważ w moim skrypcie biorę $? z grep i sprawdź, czy grep pasuje do ciągu? yael
Nie jestem pewien, czy istnieje prosty sposób, aby to zrobić. Co więcej, to podejście nie działa w skrypcie, w którym bash nie ma aktywnej kontroli zadań. Być może będziesz musiał skorzystać z odrobiny włamań do Perla, aby wykonać zadanie w skrypcie. Hmm ...
Walter Mundt,
można przyjechać to pytanie do perla? Yael
4

Utwórz nowy plik o nazwie „tgrep” i umieść w nim następujące elementy (lub nazwij go, jak chcesz):

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

Następnie uruchom chmod a+x tgrep. Teraz, jeśli chcesz go użyć, możesz wpisać

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

Możesz też użyć go jako tgrep (bez ./ i móc go używać z dowolnego katalogu), jeśli umieścisz go w katalogu zawartym w zmiennej $ PATH (np. / Home / dan / bin /, jeśli to jest w twoja zmienna $ PATH, w przeciwnym razie możesz ją dodać).

Jarvin
źródło