У меня проблемы с фоном bash и переадресацией файлов.

Мне нужно подключиться к удаленному сенсорному блоку и записать поток данных ascii из этого блока на файлы дисков. Я хотел бы разбить этот поток данных на сегменты по 10 минут каждый с меткой даты и времени, прикрепленной к имени файла.

Для этого у меня есть скрипт, который генерирует имя файла, подключается к удаленному блоку, используя nc > filename . (обратите внимание, что я установил время в прикрепленном коде на 1 минуту, а не на 10 минут).

Этот скрипт записывает данные в сгенерированное имя файла, как и ожидалось:

#!/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

Но выполнение никогда не проходит nc .

Фоновый nc , с другой стороны, дает правильные имена файлов, но они являются пустыми файлами.

 #!/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

Но файлы пусты:

$ 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

Я подумал, что это консоль stdin/stdout, поэтому я попытался запустить сеанс dtach с теми же результатами: хорошие имена файлов, никаких данных.

1 ответ1

0

Выходные файлы будут пустыми, если на другом конце нечего подключать. Проверьте с помощью netstat -ln | grep portnumber на сервере. Если другой конец является другим экземпляром netcat, вам нужно дождаться его запуска после завершения работы клиента и дождаться начала нового процесса.

$ 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

Этот подход имеет недостатки, потому что вы неизбежно потеряете данные при повторном подключении. Если другой конец действительно является другим экземпляром nc , то просто перезапустить сервер в цикле оболочки будет проблематично (по моему опыту он не может повторно связываться несколько раз). Поэтому попробуйте сохранить одно соединение и сделать что-то с выходом:

$ 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

Это не идеально, но лучше. Также вы можете проверить соединение с nmap например:

nmap eee.lan -p 5555 | grep -q  '^5555.*open' && echo open

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .