Linux-Bash-Hintergrund und E / A-Umleitung

0

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 ncdie 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.

user52874
quelle
NCPID ist eine Variable, keine Datei, daher sollten Sie kill $NCPIDstattdessen verwenden.
Chepner

Antworten:

0

Die Ausgabedateien sind leer, wenn am anderen Ende keine Verbindung hergestellt werden kann. Überprüfen Sie mit netstat -ln | grep portnumberauf 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.

$ cat connect-and-wait.sh
#!/bin/sh

dir=/home/jaroslav/tmp/so/nc-for-5-sec

while true; do
    now=`date +%Y-%m-%d.%H:%M:%S`
    fil=gps1-freq-ref-capture-$now
    out=$dir/$fil

    nc eee.lan 5555 > $out &
    pid=$!

    sleep 5 && kill $pid && echo wrote $out
    #sleep 1;                                  <-- try this 
done

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:

$ cat connect-and-rotate-log.sh
#!/bin/sh

dir=/home/jaroslav/tmp/so/nc-for-5-sec

now=out
fil=gps1-freq-ref-capture-$now
out_=$dir/$fil

nc eee.lan 5555 > $out_ &

while [ -f $out_ ]; do
    now=`date +%Y-%m-%d.%H:%M:%S`
    fil=gps1-freq-ref-capture-$now
    out=$dir/$fil

    sleep 5
    echo wrote $out

    cp $out_ $out
    echo > $out_
done

Es ist nicht perfekt, aber besser. Vielleicht möchten Sie auch die Verbindung überprüfen, nmapzum Beispiel mit:

nmap eee.lan -p 5555 | grep -q  '^5555.*open' && echo open
Ярослав Рахматуллин
quelle
Danke für Ihre Antwort. Das sieht besser aus als das, was ich verwendet habe. Es stellte sich heraus, dass das ursprüngliche Problem irrelevant wurde, da wir beschlossen, alle Boxen (DIGI TS16 Serial / IP-Wandler) durch etwas solideres und zuverlässigeres (Moxa's) zu ersetzen, anstatt weiterhin zu versuchen, Fehler zu beheben. Danke noch einmal.
user52874