Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Programm automatisch nach N Sekunden beenden
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Fri Mar 16, 2007 8:24 am    Post subject: Programm automatisch nach N Sekunden beenden Reply with quote

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
View user's profile Send private message
slick
Bodhisattva
Bodhisattva


Joined: 20 Apr 2003
Posts: 3495

PostPosted: Fri Mar 16, 2007 10:02 am    Post subject: Reply with quote

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
View user's profile Send private message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Fri Mar 16, 2007 10:37 am    Post subject: Reply with quote

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
View user's profile Send private message
Finswimmer
Bodhisattva
Bodhisattva


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Fri Mar 16, 2007 10:43 am    Post subject: Reply with quote

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
View user's profile Send private message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Fri Mar 16, 2007 10:45 am    Post subject: Reply with quote

Koenntest Du das ein bisschen naeher erklaeren? Ich hab's gerade nicht so ganz verstanden... :oops:
_________________
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
View user's profile Send private message
Finswimmer
Bodhisattva
Bodhisattva


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Fri Mar 16, 2007 10:53 am    Post subject: Reply with quote

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
View user's profile Send private message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Fri Mar 16, 2007 11:04 am    Post subject: Reply with quote

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
View user's profile Send private message
Finswimmer
Bodhisattva
Bodhisattva


Joined: 02 Sep 2004
Posts: 5467
Location: Langen (Hessen), Germany

PostPosted: Fri Mar 16, 2007 11:11 am    Post subject: Reply with quote

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
View user's profile Send private message
schachti
Advocate
Advocate


Joined: 28 Jul 2003
Posts: 3765
Location: Gifhorn, Germany

PostPosted: Fri Mar 16, 2007 11:16 am    Post subject: Reply with quote

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
View user's profile Send private message
slick
Bodhisattva
Bodhisattva


Joined: 20 Apr 2003
Posts: 3495

PostPosted: Fri Mar 16, 2007 11:39 am    Post subject: Reply with quote

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
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum