View previous topic :: View next topic |
Author |
Message |
schachti Advocate
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Fri Mar 16, 2007 8:24 am Post subject: Programm automatisch nach N Sekunden beenden |
|
|
Kennt jemand eine moeglichst einfache oder besonders elegante Variante, um aus einem Bash-Skript heraus ein Programm aufzurufen und dieses - falls es sich nach N Sekunden noch nicht selbst regulaer beendet hat - per SIGTERM bzw. SIGKILL zu beenden? _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern. |
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Fri Mar 16, 2007 10:02 am Post subject: |
|
|
Ich habe da nur einen (nicht perfekten) Ansatz, wenn ich mich recht an den Syntax erinnere (sitze hier leider grad von Win)
Code: | befehl &
PID=$!
sleep 10
kill $PID |
vor dem kill ggf. noch eine Prüfung über ps obs wirklich noch läuft
EDIT: ja, so ungefähr kommt das hin, siehe http://tldp.org/LDP/abs/html/internalvariables.html zu $!
Quote: | Using $! for job control:
Code: | possibly_hanging_job & { sleep ${TIMEOUT}; eval 'kill -9 $!' &> /dev/null; }
# Forces completion of an ill-behaved program.
# Useful, for example, in init scripts.
# Thank you, Sylvain Fourmanoit, for this creative use of the "!" variable.
|
Or, alternately:
Code: | # This example by Matthew Sage.
# Used with permission.
TIMEOUT=30 # Timeout value in seconds
count=0
possibly_hanging_job & {
while ((count < TIMEOUT )); do
eval '[ ! -d "/proc/$!" ] && ((count = TIMEOUT))'
# /proc is where information about running processes is found.
# "-d" tests whether it exists (whether directory exists).
# So, we're waiting for the job in question to show up.
((count++))
sleep 1
done
eval '[ -d "/proc/$!" ] && kill -15 $!'
# If the hanging job is running, kill it.[/quote]
} |
|
|
|
Back to top |
|
|
schachti Advocate
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Fri Mar 16, 2007 10:37 am Post subject: |
|
|
ok, soweit schonmal ganz gut - wenn aber das Programm nach 10 Sekunden schon fertig ist, ich das Skript aber mit sleep erstmal 15 Minuten schlafen lege, ist das auch bloed, zumal das ganze in einer Schleife vorkommt.
Ich koennte auch eine weitere Schleife einbauen, die 1 x pro Sekunde prueft, ob der Prozess noch lebt
Code: |
befehl &
PID=$!
for ((i=1; i<=$GESAMTWARTEZEIT; i++)); do
sleep 1
ps --pid $PID 1>/dev/null || break
done
kill $PID
|
Gibt's da keine elegantere Loesung? _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern. |
|
Back to top |
|
|
Finswimmer Bodhisattva
Joined: 02 Sep 2004 Posts: 5467 Location: Langen (Hessen), Germany
|
Posted: Fri Mar 16, 2007 10:43 am Post subject: |
|
|
Wenn der Befehl sich selbst sauber beendet könntest du einen Rückgabewert erzeugen, der das andere Programm beendet.
Tobi[/code] _________________ Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke |
|
Back to top |
|
|
schachti Advocate
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Fri Mar 16, 2007 10:45 am Post subject: |
|
|
Koenntest Du das ein bisschen naeher erklaeren? Ich hab's gerade nicht so ganz verstanden... _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern. |
|
Back to top |
|
|
Finswimmer Bodhisattva
Joined: 02 Sep 2004 Posts: 5467 Location: Langen (Hessen), Germany
|
Posted: Fri Mar 16, 2007 10:53 am Post subject: |
|
|
cmd1 && echo "Programm sauber beendet"
Der echo Teil wird nur ausgeführt, wenn cmd1 ohne Fehler durchlief.
Du kannst dann einfach das Überwachungsprogramm damit killen:
cmd1 && killall $program
Tobi _________________ Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke |
|
Back to top |
|
|
schachti Advocate
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Fri Mar 16, 2007 11:04 am Post subject: |
|
|
ok, jetzt verstehe ich Dich. Das geht allerdings nicht, weil ich das innerhalb einer Schleife machen will - beende ich das Ueberwachungsprogramm, werden nicht alle Schleifendurchlaeufe ausgefuehrt. _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern. |
|
Back to top |
|
|
Finswimmer Bodhisattva
Joined: 02 Sep 2004 Posts: 5467 Location: Langen (Hessen), Germany
|
Posted: Fri Mar 16, 2007 11:11 am Post subject: |
|
|
Verdammt. Und wenn du den Teil auslagerst und somit doch explizit diesen Teil ausschalten kannst?
Tobi _________________ Bitte auf Rechtschreibung, korrekte Formatierung und Höflichkeit achten!
Danke |
|
Back to top |
|
|
schachti Advocate
Joined: 28 Jul 2003 Posts: 3765 Location: Gifhorn, Germany
|
Posted: Fri Mar 16, 2007 11:16 am Post subject: |
|
|
ok, das ginge wohl auch - was ich mir wuenschen wurde, waere ein Befehl aehnlich time, der eben nicht die Ausfuehrungszeit misst, sondern der nach N Sekunden ein SIGTERM schickt. Aber es bleibt mir wohl nichts anderes uebrig, als mit Bash-Code zu frickeln oder mir ein solches Programm selbst zu schreiben (meine Hoffnung war halt, dass es sowas schon gibt - ich bin ja bestimmt nicht der erste, der dieses Problem hat). _________________ Never argue with an idiot. He brings you down to his level, then beats you with experience.
How-To: Daten verschlüsselt auf DVD speichern. |
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Fri Mar 16, 2007 11:39 am Post subject: |
|
|
Also entweder Du startest den Befehl im Hintergrund, holst dann über $! die PID von diesem und kannst diesen nach einem Timeout beenden (s.o.) oder Du startet vorher einen Timer im Hintergrund, danach den Befehl und wenn der Timer abläuft startet er ein "kill" Script im Hintergrund. Zweitens hat allerdings den Nachteil das der Timer nicht die PID vom Programm haben kann (stimmt doch oder?), somit könnte das Kill-Script das falsche killen. Machbar ist beides. Damit sollten alle machbaren Szenarien abgedeckt sein und du mußt nur das optimale für dich finden und entspreched anpassen. |
|
Back to top |
|
|
|