Назад | Перейти на главную страницу

перенаправление вывода из telnet / nc в файл в скрипте не выполняется, когда cron'd

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

#!/bin/bash

#Config Variables. Age is in Days.
DATA_ROOT=/root/data
FILENAME=data_`date +%F`.dat
HOST=device
COMPRESS_AGE=3

#Sanity Checks
if [ ! -e $DATA_ROOT ]
then
        echo "The directory $DATA_ROOT seems to not exist. Please create it."
        exit 1
fi

if [ -e $DATA_ROOT/$FILENAME ]
then
        echo "You seem to have extracted data already today. Aborting"
        exit 1
fi


#Get Data
nc $HOST 2202 > $DATA_ROOT/$FILENAME
#Compress old Data
find $DATA_ROOT -type f -mtime +$COMPRESS_AGE -exec gzip {} \;

exit 0

Он отлично работает, когда я запускаю его вручную, но когда я запускаю его из cron, он не захватывает никаких результатов. Если я заменю nc на telnet, я увижу начальные заголовки telnet о управляющих последовательностях и многом другом, но не данные.

Идеи? Я пробовал заставить bash действовать как интерактивную оболочку с -i. Я пробовал перенаправить как stderr, так и stdout. Я знаю, что это должна быть какая-то дурацкая простая вещь, но я совершенно проигрываю. Это сводит меня с ума...

РЕДАКТИРОВАТЬ Я также только что заметил, что процессы nc из всех моих предыдущих попыток спали, и когда я их убил, cron отправил мне кучу бессмысленных сообщений об ошибках. По крайней мере, теперь мне есть во что вникнуть!

Возможно, ваш сценарий работает, и теряется только вывод. Вы можете попробовать записать вывод nc в собственную переменную, а затем повторить эту переменную в

#Get Data
ncoutput=$( /path/to/nc $HOST 2202 2>&1 )
printf "%s\n" "$ncoutput" > $DATA_ROOT/$FILENAME
#Compress old Data
find $DATA_ROOT -type f -mtime +$COMPRESS_AGE -exec gzip {} \;

exit 0

printf сохраняет форматирование вывода, тогда как эхо нет.