Итак, у меня есть устройство в моей сети, которое сидит там, прослушивая порт для соединения, и когда соединение установлено, оно выгружает данные 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 сохраняет форматирование вывода, тогда как эхо нет.