Ich habe Probleme mit Bash-Hintergründen und der Dateiumleitung.
Ich muss eine Remote-Sensorbox anschließen und den ASCII-Datenstrom von dieser Box auf Datenträgerdateien aufzeichnen. Ich möchte diesen Datenstrom in Segmente von jeweils etwa 10 Minuten mit einem Datums- / Uhrzeitstempel aufteilen, der dem Dateinamen angehängt ist.
Zu diesem Zweck habe ich ein Skript, das einen Dateinamen generiert, mit dem eine Verbindung zur Remote-Box hergestellt wird nc > filename
. (Beachten Sie, dass ich das Timing im angehängten Code auf 1 Minute anstatt auf 10 Minuten eingestellt habe).
Dieses Skript zeichnet erwartungsgemäß Daten im generierten Dateinamen auf:
#!/bin/bash
DEST=/home/sensors/gps1
[[ -d $DEST ]] || mkdir -p $DEST
while true
do
DESTFILE=$DEST/"gps1-freq-ref-capture-"`date +"%Y-%m-%d-%H%M"`
nc fepts03 20014 > $DESTFILE
NCPID=$!
sleep 60 ; kill $NCPID
done
Aber die Hinrichtung kommt nie vorbei nc
.
Im Hintergrund werden nc
die richtigen Dateinamen angezeigt, es handelt sich jedoch um leere Dateien.
#!/bin/bash
DEST=/home/sensors/gps1
[[ -d $DEST ]] || mkdir -p $DEST
while true
do
DESTFILE=$DEST/"gps1-freq-ref-capture-"`date +"%Y-%m-%d-%H%M"`
nc fepts03 20014 > $DESTFILE & # <-- note backgrounding ampersand
NCPID=$!
sleep 60 ; kill $NCPID
done
Aber die Dateien sind leer:
$ ls -la
-rw-rw-rw-+ 1 sensors sensors 0 Jul 23 15:00 gps1-freq-ref-capture-2012-07-23-1500
-rw-rw-rw-+ 1 sensors sensors 0 Jul 23 15:01 gps1-freq-ref-capture-2012-07-23-1501
-rw-rw-rw-+ 1 sensors sensors 0 Jul 23 15:02 gps1-freq-ref-capture-2012-07-23-1502
Ich dachte, es sei eine stdin / stdout-Konsolensache, also versuchte ich, in einer dtach-Sitzung mit den gleichen Ergebnissen zu laufen: gute Dateinamen, keine Daten.
quelle
kill $NCPID
stattdessen verwenden.Antworten:
Die Ausgabedateien sind leer, wenn am anderen Ende keine Verbindung hergestellt werden kann. Überprüfen Sie mit
netstat -ln | grep portnumber
auf dem Server. Wenn das andere Ende eine andere Instanz von netcat ist, müssen Sie warten, bis es ausgeführt wird, nachdem der Client beendet wurde, und warten, bis der neue Prozess gestartet wird.Dieser Ansatz ist fehlerhaft, da Sie beim erneuten Herstellen der Verbindung Daten verlieren müssen. Wenn das andere Ende tatsächlich eine andere Instanz von ist
nc
, ist es problematisch, den Server nur in einer Shell-Schleife neu zu starten (meiner Erfahrung nach kann er einige Male nicht neu gebunden werden). Versuchen Sie also, eine Verbindung beizubehalten und machen Sie stattdessen etwas mit der Ausgabe:Es ist nicht perfekt, aber besser. Vielleicht möchten Sie auch die Verbindung überprüfen,
nmap
zum Beispiel mit:quelle