Discussion:
Kommando soll nach best. Zeit abbrechen
(zu alt für eine Antwort)
Christian Schaefer
2005-09-02 11:50:17 UTC
Permalink
Hi,

Wie schaffe ich es, dass ein Kommando welches nach x Sekunden nicht
terminiert, gekillt wird?

Es geht konkret um folgendes:
Auf einem entfernten Rechner soll mittels ssh ein Kommando ausgefuehrt
werden. Laeuft aber auf diesem Rechner Windows mit aktivierter Firewall,
so bleibt ssh haengen und terminiert nicht.
Nun soll ssh nach x Sekunden abgebrochen werden.

Ich suche nach einer Loesung in Bash oder notfalls Python, die _ohne_
Threads auskommt.

Gruss
Christian
J. Seyfferth
2005-09-02 16:29:20 UTC
Permalink
Post by Christian Schaefer
Wie schaffe ich es, dass ein Kommando welches nach x Sekunden nicht
terminiert, gekillt wird?
Auf einem entfernten Rechner soll mittels ssh ein Kommando ausgefuehrt
werden. Laeuft aber auf diesem Rechner Windows mit aktivierter Firewall,
so bleibt ssh haengen und terminiert nicht.
Nun soll ssh nach x Sekunden abgebrochen werden.
Ich suche nach einer Loesung in Bash oder notfalls Python, die _ohne_
Threads auskommt.
Vielleicht hilft Dir das ja weiter:

$ wget -O /tmp/timeout.c \
http://www.terraluna.org/cgi-bin/cvsweb.cgi/satan/src/misc/timeout.c

$ gcc /tmp/timeout.c -o /usr/local/bin/timeout

und in Deinem Bash-Script:

timeout 10 ssh ***@servername.tld your_command
--
Mit freundlichen Gruessen
J. Seyfferth

Bill, Gates noch?
Philipp Tölke
2005-09-02 16:48:42 UTC
Permalink
Post by Christian Schaefer
Hi,
Moin,
Post by Christian Schaefer
Wie schaffe ich es, dass ein Kommando welches nach x Sekunden nicht
terminiert, gekillt wird?
Wie wäre es mit:

kommando &
sleep x
killall kommando

?
--
|¯¯¯\ |¯| |¯| |¯| |¯| |¯| |¯¯¯\|¯¯¯\ |¯¯¯¯¯| ***@web.de (valid,
| |_| | `-´ | | | | | | | | |_|| |_| ¯| |¯ but filtered strictly)
| | | ,-. | | | | |_ | | | | | | | | ICQ:117362083
|_| |_| |_| |_| |___||_| |_| |_| |_| O Germany
Ingo van Lil
2005-09-02 17:00:12 UTC
Permalink
Post by Philipp Tölke
Post by Christian Schaefer
Wie schaffe ich es, dass ein Kommando welches nach x Sekunden nicht
terminiert, gekillt wird?
kommando &
sleep x
killall kommando
Tolle Sache, dann schießt es ihm ein paar Sekunden später alle
offenen ssh-Verbindungen weg. Wenn überhaupt, dann

kommando &
sleep x
kill $!

Hat aber immer noch den Nachteil, daß das Kommand als Hintergrundprozeß
läuft, was bei einer ssh-Sitzung nicht in jedem Fall wünschenswert ist.

Tschau,
Ingo
--
Nothing spoils fun like finding out it builds character.
-- Bill Watterson: Calvin and Hobbes
Stephan Grein
2005-09-02 17:05:25 UTC
Permalink
Post by Ingo van Lil
Post by Philipp Tölke
Post by Christian Schaefer
Wie schaffe ich es, dass ein Kommando welches nach x Sekunden nicht
terminiert, gekillt wird?
kommando &
sleep x
killall kommando
Tolle Sache, dann schießt es ihm ein paar Sekunden später alle
offenen ssh-Verbindungen weg. Wenn überhaupt, dann
kommando &
sleep x
kill $!
Hat aber immer noch den Nachteil, daß das Kommand als Hintergrundprozeß
läuft, was bei einer ssh-Sitzung nicht in jedem Fall wünschenswert ist.
Tschau,
Ingo
Mh, vielleicht ein
kommandao &
wait %1
kill pidof kommando
?
Ich weiss nicht ob dies das ist was du willst. :)

Cheers.


- --
Stephan 'hagbard' Grein, <***@gmail.com>
http://hagbard.ninth-art.de/
GnuPG-Key-ID: 0x08FA3507
<ESC> :wq
Ingo van Lil
2005-09-02 17:27:54 UTC
Permalink
Post by Stephan Grein
Post by Ingo van Lil
Tolle Sache, dann schießt es ihm ein paar Sekunden später alle
offenen ssh-Verbindungen weg. Wenn überhaupt, dann
kommando &
sleep x
kill $!
Hat aber immer noch den Nachteil, daß das Kommand als Hintergrundprozeß
läuft, was bei einer ssh-Sitzung nicht in jedem Fall wünschenswert ist.
Mh, vielleicht ein
kommandao &
wait %1
kill pidof kommando
Das funktioniert bei einer ssh-Sitzung auch nicht richtig, die darf
einfach nicht im Hintergrund sein. Und Dein kill-Kommando funktioniert
in dieser Syntax überhaupt nicht, und "kill `pidof kommando`" hätte das
selbe Problem wie "killall kommando": Alle offenen ssh-Sitzungen werden
beendet, nicht nur die eine gewünschte.

Tschau,
Ingo
--
Nothing spoils fun like finding out it builds character.
-- Bill Watterson: Calvin and Hobbes
Werner Olschewski
2005-09-02 20:00:37 UTC
Permalink
Post by Philipp Tölke
Post by Christian Schaefer
Hi,
Moin,
Post by Christian Schaefer
Wie schaffe ich es, dass ein Kommando welches nach x Sekunden nicht
terminiert, gekillt wird?
kommando &
sleep x
killall kommando
Nein, nicht. Er hat nicht geschrieben, das er Linux verwendet und
unter Solaris schiesst Du so den Rechner komplett ab, falls er
die noetigen Rechte hat.

Meine Idee ist folgende:

kommando &
sleep x
kill -KILL $!


$! ist bei sh, ksh und bash die ID des zuletzt gestarteten
Backgroundprozesses, fuer andere shells weiss ich es nicht.


Gruss
Werner
Philipp Tölke
2005-09-02 21:47:56 UTC
Permalink
Post by Werner Olschewski
Post by Philipp Tölke
Post by Christian Schaefer
Wie schaffe ich es, dass ein Kommando welches nach x Sekunden nicht
terminiert, gekillt wird?
kommando &
sleep x
killall kommando
Nein, nicht. Er hat nicht geschrieben, das er Linux verwendet und
unter Solaris schiesst Du so den Rechner komplett ab, falls er
die noetigen Rechte hat.
"killall" heisst unter Solaris genau das? Cool[tm].
Post by Werner Olschewski
kommando &
sleep x
kill -KILL $!
$! ist bei sh, ksh und bash die ID des zuletzt gestarteten
Backgroundprozesses, fuer andere shells weiss ich es nicht.
Das war auch was ich meinte, aber das $! fiel mir nicht ein. Und ich
war mir dann nicht mehr sicher, ob es sowas überhaupt gibt. Ein anderes
Problem, das ich damit sehe ist allerdings, das so nicht unterschieden
wird, ob "kommando" so lange braucht weil bspw. das Netz langsam ist,
oder weil es "hängt"...
--
|¯¯¯\ |¯| |¯| |¯| |¯| |¯| |¯¯¯\|¯¯¯\ |¯¯¯¯¯| ***@web.de (valid,
| |_| | `-´ | | | | | | | | |_|| |_| ¯| |¯ but filtered strictly)
| | | ,-. | | | | |_ | | | | | | | | ICQ:117362083
|_| |_| |_| |_| |___||_| |_| |_| |_| O Germany
Werner Olschewski
2005-09-03 07:17:02 UTC
Permalink
Post by Philipp Tölke
Post by Werner Olschewski
Nein, nicht. Er hat nicht geschrieben, das er Linux verwendet und
unter Solaris schiesst Du so den Rechner komplett ab, falls er
die noetigen Rechte hat.
"killall" heisst unter Solaris genau das? Cool[tm].
NAME
killall - kill all aktive processes

SYNOPSIS
/usr/bin/killall [signal]


Beachte, das nimmt keine Auswahl der Prozesse an. Das Ding
wird normalerweise nur beim und von shutdown eingesetzt.

Das nur als Warnung, echte Unixe reagieren manchmal etwas
anderes als Linux.
Post by Philipp Tölke
Post by Werner Olschewski
kommando &
sleep x
kill -KILL $!
$! ist bei sh, ksh und bash die ID des zuletzt gestarteten
Backgroundprozesses, fuer andere shells weiss ich es nicht.
Das war auch was ich meinte, aber das $! fiel mir nicht ein. Und ich
war mir dann nicht mehr sicher, ob es sowas überhaupt gibt. Ein anderes
^^^^^^^^^^^^^^^^^^^^^^^^^^
RTFM
Post by Philipp Tölke
Problem, das ich damit sehe ist allerdings, das so nicht unterschieden
wird, ob "kommando" so lange braucht weil bspw. das Netz langsam ist,
oder weil es "hängt"...
Das kann man auch nicht so einfach unterscheiden, selbst wenn Du davor
sitzt, weisst Du nicht, warum nichts passiert.

Gruss
Werner
Lothar Paltins
2005-09-02 19:01:34 UTC
Permalink
Post by Christian Schaefer
Wie schaffe ich es, dass ein Kommando welches nach x Sekunden nicht
terminiert, gekillt wird?
Z.B. so:

sleep x && kill $$ &
ssh entfernter_rechner kommando

Das Ganze als Skript ausführen, nach x Sekunden wird die Skript-Shell
gekillt und damit auch die ssh.

Lothar
--
Lothar Paltins ***@freenet.de
Heiner Steven
2005-09-03 19:04:09 UTC
Permalink
Post by Christian Schaefer
Hi,
Wie schaffe ich es, dass ein Kommando welches nach x Sekunden nicht
terminiert, gekillt wird?
[...]
Post by Christian Schaefer
Ich suche nach einer Loesung in Bash oder notfalls Python, die _ohne_
Threads auskommt.
Das folgende Shellscript terminiert ein Kommando nach
einer angegebenen Zeitspanne:

http://www.shelldorado.com/scripts/cmds/timeout

Beispiel:

timeout -t 60 ping $host

Heiner
--
___ _
/ __| |_ _____ _____ _ _ Heiner STEVEN <***@nexgo.de>
\__ \ _/ -_) V / -_) ' \ Shell Script Programmers: visit
|___/\__\___|\_/\___|_||_| http://www.shelldorado.com/
Heiko Kuerschner
2005-09-03 23:15:36 UTC
Permalink
Post by Christian Schaefer
Wie schaffe ich es, dass ein Kommando welches nach x Sekunden nicht
terminiert, gekillt wird?
Auf einem entfernten Rechner soll mittels ssh ein Kommando ausgefuehrt
werden. Laeuft aber auf diesem Rechner Windows mit aktivierter
Firewall, so bleibt ssh haengen und terminiert nicht.
Nun soll ssh nach x Sekunden abgebrochen werden.
Bedeutet das, das der Port nicht erreicht wird?
Wenn ja, kannst Du vorher mit netcat oder nc (je nach System) darauf
prüfen:

netcat -w 3 -z example.com ssh

Und dann den Exitcode auswerten.
--
Kürsche
Wenns 'ner net gwittern tun tut ;)
Linux/*BSD-Anleitungen, Forum und Chat: www.newbie-net.de
HTML per Script validieren: www.unneraans.de/html-validator.sh/
Loading...