Programm nach bestimmter Zeit toeten

M

mythos

Mitglied
Hallo,

ich moechte ein bestimmtes Programm hoechstens 10s ausfuehren. (Die 10s muessen nicht exakt eingehalten werden; es koennen auch 8 oder 12s sein.) Wenn das Programm in dieser Zeit nicht beendet wurde, soll es getoetet werden. Wie kann man das einfach in Form eines Shell-Scripts implementieren?

mfg mythos
 
Zuletzt bearbeitet:
Schnellschuss (aus dem Kopf):

IIRC spuckt die Variable $! die PID eines Programmes aus, danach noch $! als Variable IRGENDEIN_NETTER_NAME definieren, ein sleep von X Sekunden und kill $IRGENDEIN_NETTER_NAME.
 
... oder du legst beim Start deines Skripts einen Killer in den Hintergrund, der nach 10 Sekunden nachschaut, ob noch wer da ist:
Code:
#!/bin/sh

( sleep 10; kill -0 $$ && kill -HUP $$ ) &

# ab hier dann das eigentliche Programm, z.B. ...

I=30
while [ $I -gt 0 ]; do
        echo $I
        sleep 1
        I=`expr $I - 1`
done
 
Hallo!

Vielen Dank fuer eure Antworten. Ich habe nun folgendes versucht:

Code:
#!/bin/bash
./blackbox &
sleep 10; kill $!

Nach 10 Sekunden erhalte ich zwar die Kontrolle ueber die Shell wieder. Jedoch sagt mir top, dass der Prozess blackbox ueberlebt hat.

mfg mythos
 
So killst Du auch nach 10 Sekunden nicht "blackbox" sondern das letzte Kommando vor dem "kill" also "sleep".

Code:
#!/bin/bash

./blackbox &

NETTER_NAME_FUER_EINE_VARIABLE=$!

sleep 10

kill $NETTER_NAME_FUER_EINE_VARIABLE
 
So killst Du auch nach 10 Sekunden nicht "blackbox" sondern das letzte Kommando vor dem "kill" also "sleep".

Ah, das hab' ich bereits vermutet; gut zu wissen. Aber diese Variante funktioniert auch nicht.

Wuerde man 'kill $var' in 'killall blackbox' umschreiben, funktioniert es interessanterweise. Jedoch will ich nicht, dass alle blackbox-Programme beendet werden, sondern nur dieses eine, das laenger als 10 Sekunden braucht.

mfg mythos
 
Ah, das hab' ich bereits vermutet; gut zu wissen. Aber diese Variante funktioniert auch nicht.

Gegenbeweis:

Code:
#!/bin/bash
ping localhost &

pingpid=$!

sleep 10

kill $pingpid &>/dev/null && echo "killed"

exit 0

und

Code:
 sh /tmp/test.sh 
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.068 ms
64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.068 ms
64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.073 ms
64 bytes from localhost (127.0.0.1): icmp_seq=6 ttl=64 time=0.069 ms
64 bytes from localhost (127.0.0.1): icmp_seq=7 ttl=64 time=0.069 ms
64 bytes from localhost (127.0.0.1): icmp_seq=8 ttl=64 time=0.065 ms
64 bytes from localhost (127.0.0.1): icmp_seq=9 ttl=64 time=0.068 ms
64 bytes from localhost (127.0.0.1): icmp_seq=10 ttl=64 time=0.069 ms
killed
 
Ich habe eine Vermutung: Der blackbox-Prozess den ich via top sehe, ist ein Kind-Prozess vom Programm blackbox, das ich zuvor getoetet habe.

Das funktioniert naemlich:
Code:
./blackbox &
pid=$!
sleep 10
for i in `ps -ef| awk '$3 == '$pid' { print $2 }'`
do
    kill $i
done
 
Zuletzt bearbeitet:

Ähnliche Themen

Kurzzusammenfassung der Befehle und Progr. für die shell

Linux Kernel VFS Panic HP Thin Client

Löschroutine mit Überprüfung

WINEMANAGER - Ein Tool zum Verwalten von WINE [BETA]

Wieder mal Probleme mit yum

Zurück
Oben