Frage

Ich habe ein Paar von Shell-Programmen, die über eine Named Pipe zu sprechen. Der Leser schafft das Rohr, wenn es beginnt, und entfernt sie, wenn es beendet wird.

Manchmal wird der Schriftsteller versuchen, auf das Rohr zwischen dem Zeitpunkt, zu schreiben, dass der Leser aufhört zu lesen und die Zeit, dass es das Rohr entfernt.

reader: while condition; do read data <$PIPE; do_stuff; done
writer: echo $data >>$PIPE
reader: rm $PIPE

Wenn dies geschieht, wird der Schriftsteller hängt immer versucht, das Rohr zu öffnen für das Schreiben.

Gibt es eine clean , wie es ein Timeout zu geben, so dass es nicht gehangen bleiben, bis sie manuell getötet? Ich weiß, dass ich tun kann,

#!/bin/sh
# timed_write <timeout> <file> <args>
# like "echo <args> >> <file>" with a timeout

TIMEOUT=$1
shift;
FILENAME=$1
shift;
PID=$$

(X=0; # don't do "sleep $TIMEOUT", the "kill %1" doesn't kill the sleep
 while [ "$X" -lt "$TIMEOUT" ];
 do sleep 1; X=$(expr $X + 1);
 done; kill $PID) &

echo "$@" >>$FILENAME
kill %1

aber dies ist eine Art kitschig. Gibt es ein Shell-builtin oder Befehl dieses sauberer zu machen (ohne die C-Compiler Ausbrechen)?

War es hilfreich?

Lösung 3

Dieses Paar von Programmen arbeitet viel schöner nach Unix-Domain-Sockets in Perl neu geschrieben werden statt Named Pipes verwenden. Das besondere Problem in dieser Frage ging ganz weg, denn wenn / wenn ein Ende der Verbindung stirbt statt hanging verschwindet.

Andere Tipps

Die UNIX „Standard“ Art und Weise des Umgangs mit dieser benutzen erwarten , die mit timed- kommt laufen. Beispiel: ein Programm nur für eine bestimmte Zeit läuft

Erwarten kann das Wunder für Scripting tun, es lohnt sich zu lernen. Wenn Sie nicht Tcl mögen, gibt es ein Python Erwarten als auch Modul.

Diese Frage kommt regelmäßig auf (obwohl ich es nicht mit der Suche gefunden). Ich habe zwei Shell-Skripte geschrieben als Timeout Befehle zu verwenden: ein für die Dinge, die Standardeingabe und einen für Dinge lesen, die nicht die Standardeingabe gelesen haben. Das stinkt, und ich habe Sinn wurde ein C-Programm zu schreiben, aber ich habe nicht um, um es noch bekommen. Ich würde auf jeden Fall empfehlen, einen timeout Befehl in C schreibe ein für allemal. Aber in der Zwischenzeit, hier ist die einfachere der beiden Shell-Skripten, die hängt, wenn der Befehl Standardeingabe liest:

#!/bin/ksh

# our watchdog timeout in seconds
maxseconds="$1"
shift

case $# in
  0) echo "Usage: `basename $0` <seconds> <command> [arg ...]" 1>&2 ;;
esac

"$@" &
waitforpid=$!

{
    sleep $maxseconds
    echo "TIMED OUT: $@" 1>&2 
    2>/dev/null kill -0 $waitforpid && kill -15 $waitforpid
} &
killerpid=$!

>>/dev/null 2>&1 wait $waitforpid
# this is the exit value we care about, so save it and use it when we
rc=$?

# zap our watchdog if it's still there, since we no longer need it
2>>/dev/null kill -0 $killerpid && kill -15 $killerpid

exit $rc

Das andere Skript ist online unter http: //www.cs.tufts. edu / ~ nr / drop / Timeout .

trap 'kill $(ps -L $! -o pid=); exit 30' 30
echo kill -30 $$ 2\>/dev/null | at $1 2>/dev/null
shift; eval $@ &
wait
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top