Töte den Prozess, nachdem er einige Zeit laufen gelassen wurde


13

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

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

grep -qsRw -m1 "parameter" /var

Bevor grepich den Befehl ausführe, möchte ich die Lebensdauer des grepProzesses begrenzen , beispielsweise nicht länger als 30 Sekunden.

Wie mache ich das?

Und wenn ja, wie kann ich zurückkehren oder zurücksetzen, um danach keine zeitliche Begrenzung zu haben?


3
hast du das nicht schon gefragt stackoverflow.com/questions/3061377/…

Nein, diese andere Frage, weil ich keine Antwort auf die ursprüngliche Frage Yael

4
@yael: Sie haben zuvor eine perfekte Lösung verwendet timeoutund sogar Anweisungen zur Installation erhalten. Es ist unhöflich, diese Antwort zu ignorieren und dann Ihre Frage zu duplizieren.
Paul R

Entschuldigung, aber NEIN Ich möchte nichts auf meinem System installieren. THX yael

5
@yael: dann müssen Sie Ihre ursprüngliche Frage aktualisieren, um diese Einschränkung einzuschließen , NICHT nur die Frage duplizieren und von vorne beginnen
Paul R

Antworten:


12

Sie können timelimit 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 einer Zeitüberschreitung ein "Kill" -Signal, ähnlich wie init (8) beim Herunterfahren arbeitet.


2
Es ist nicht in meinem Ubuntus (10.10 Desktop, 11.04 Server), also wahrscheinlich kein Standard. Aber leicht mit einem schnellen packen sudo aptitude install timelimit. Funktioniert hervorragend nach der Installation.
Tag

7

Hier ist ein leicht hackiger Schlag dafür:

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

Grundsätzlich wird die Suche im Hintergrund gestartet, dann wird eine Unterschale gestartet, die 30 Sekunden wartet und dann den Suchvorgang abbricht. Wenn die Suche <30 Sekunden dauert, ist der Prozess bereits beendet. Es ist keine gute Idee, einen Prozess zu beenden, der bereits tot ist, da die Wahrscheinlichkeit sehr gering ist, dass etwas anderes die PID wiederverwendet, aber für so etwas ist es im Allgemeinen in Ordnung. Zuletzt wird die Suche wieder in den Vordergrund gestellt und so lange ausgeführt, bis sie beendet ist oder beendet wird.


Wie bekomme ich die $? aus dem grep in diesem Fall, weil ich in meinem Skript die $? von grep und überprüfen, ob grep mit der Zeichenfolge übereinstimmt? Yael

Ich bin mir nicht sicher, ob es dafür einen einfachen Weg gibt. Darüber hinaus funktioniert dieser Ansatz nicht in einem Skript, in dem bei bash keine Jobsteuerung aktiv ist. Möglicherweise müssen Sie auf ein bisschen Perl-Hackery zurückgreifen, um die Arbeit in einem Skript zu erledigen. Hmm ...
Walter Mundt

ist es möglich, diese frage perl anzukommen? Yael

4

Erstellen Sie eine neue Datei mit dem Namen "tgrep" und fügen Sie Folgendes ein (oder nennen Sie sie wie Sie möchten):

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

Als nächstes laufen chmod a+x tgrep. Wenn Sie es jetzt verwenden möchten, können Sie eingeben

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

Oder Sie können es einfach als tgrep verwenden (ohne das ./ und können es aus einem beliebigen Verzeichnis verwenden), wenn Sie es in einem Verzeichnis ablegen, das in Ihrer $ PATH-Variablen enthalten ist (wie / home / dan / bin /, falls dies der Fall ist) Ihre $ PATH-Variable, andernfalls können Sie sie hinzufügen).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.