Kill-Prozess, nachdem es einige Zeit ausgeführt wurde

8918
yael

Ich möchte die Zeit begrenzen, die ein grepProzessbefehl ausführen darf oder lebt.

Zum Beispiel. Ich möchte folgendes ausführen:

grep -qsRw -m1 "parameter" /var 

Bevor Sie den grepBefehl ausführen, möchte ich jedoch einschränken, wie lange der grepProzess noch dauert, beispielsweise nicht länger als 30 Sekunden.

Wie mache ich das?

Und wenn ja, wie gehe ich zurück oder setze ich zurück, um danach keine Zeitbegrenzung zu haben.

11
hast du das nicht schon gefragt? http://stackoverflow.com/questions/3061377/grep-add-time-out-nach-some-time-if-not-find-the-relevant-match vor 13 Jahren 3
Nein, diese andere Frage, weil ich keine Antwort auf die ursprüngliche Frage Yael bekomme vor 13 Jahren 0
@yael: Du hast vorher eine absolut gute Lösung mit "timeout" und du hast sogar Anweisungen bekommen, wie du es installierst. Es ist unhöflich, diese Antwort zu ignorieren und dann Ihre Frage zu duplizieren. Paul R vor 13 Jahren 4
Entschuldigung aber NEIN Ich möchte nichts auf meinem System THX yael installieren vor 13 Jahren 0
Mein Linux hat keine Zeitüberschreitung und ich kann es nicht installieren, Yael vor 13 Jahren 0
@yael: dann musst du * deine ursprüngliche Frage * aktualisieren, um diese Einschränkung einzubeziehen *, NICHT die Frage einfach duplizieren und noch einmal von vorne beginnen Paul R vor 13 Jahren 5
Schauen Sie sich auch diesen BASH-FAQ-Eintrag an. (Http://mywiki.wooledge.org/BashFAQ/068) Walter Mundt vor 13 Jahren 0

3 Antworten auf die Frage

10
feniix

Sie können Zeitlimit verwenden, es ist im Standard-Ubuntu verfügbar oder Sie können es selbst kompilieren.

timelimit führt einen Befehl aus und beendet den erzeugten Prozess nach einer bestimmten Zeit mit einem bestimmten Signal. Zuerst wird ein "Warnsignal" gesendet, dann nach einem Timeout ein "Kill" -Signal, ähnlich wie bei der Abschaltung von init (8).

Es ist nicht in meinem Ubuntus (10.10 Desktop, 11.04 Server), daher ist es wahrscheinlich kein Standard. Aber mit einem schnellen `sudo aptitude install timelimit` einfach zu greifen. Funktioniert gut, sobald es installiert ist. Day vor 13 Jahren 2
6
Walter Mundt

Here's some slightly hackish bash for that:

grep -qsRw -m1 "parameter" /var & GREPPID=$! ( sleep 30; kill $GREPPID ) & fg $GREPPID 

Basically, it starts the search in the background, then starts a subshell that waits 30 seconds and then kills the search process. If the search takes <30s, the process will already be dead. It's not a great idea to kill a process that's already dead since there's a very small chance something else will reuse the pid, but for something like this it's generally okay. Lastly, the search is put back in the foreground and will run until it finishes or is killed.

wie bekomme ich das $? aus dem grep in diesem fall, weil ich in meinem script den $? von grep und überprüfen, ob grep mit der Zeichenfolge übereinstimmt? Yael vor 13 Jahren 0
Ich bin mir nicht sicher, ob es einen einfachen Weg gibt. Darüber hinaus funktioniert dieser Ansatz nicht in einem Skript, bei dem in bash keine Jobsteuerung aktiv ist. Möglicherweise müssen Sie auf ein bisschen Perl-Hacker zurückgreifen, um die Arbeit in einem Skript zu erledigen. Hmm ... Walter Mundt vor 13 Jahren 0
ist es möglich, diese Frage zu perl zu bekommen? Yael vor 13 Jahren 0
3
Jarvin

Create a new file called "tgrep" and put in it the following (or call it whatever you want):

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

Next, run chmod a+x tgrep. Now if you want to use it you can type

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

Or you can just use it as tgrep (without the ./ and be able to use it from any directory) if you place it in a directory contained in your $PATH variable (like /home/dan/bin/, if that is in your $PATH variable, otherwise you can add it).