Система АРМ, которой мы занимаемся, построена, кратко, так: при загрузке linux запускается ряд программ-демонов, которые выполняют приём и обработку поступающей информации.
Запуск производится из скрипта, который вызывается из /etc/rc.local.
Первым запускается программа протоколирования событий, log. Она принимает сообщения от других программ и пишет в файл протокола записями по 64 байта.
Чтобы просматривать эти логи, я написал программу vlog, которая читает эти записи и выводит их в stdout их в виде, понятным человеку.
Программа log по запросу или с заданным интервалом закрывает текущий файл и открывает новый. А предыдущий сжимает командой gzip FILE, запускаемой через system();
Начальник сказал: "Заказчик хочет иметь логи в формате .csv (не всех событий, а части). Стал думать, как это реализовать. И решил сжимать файлы через system("./log.sh gzip FILE&");
А в скрипт log.sh после упаковки добавить преобразование программой vlog, фильтрацию grepом и корректировку sedом с записью результата в отдельный каталог.
Заменил программу log, перезапустил её-- всё работает. Но потом работать перестало. То есть файлы.csv образуются, но нулевой длины. Но протолы log*.dat заменяются на log*.dat.gz. То есть начало скрипта работает.
Запускаю скрипт руками -- всё работает нормально. А из работающей программы скрипт работать нормально не хочет.
Перезапустил программу log -- всё работает нормально.
То есть получается, что когда программа log запускается из скрипта, который запускается из /etc/rc.local, то в скрипте log.sh программа gzip сжимает файл нормально, а vlog работать не хочет.
Когда программу log запускаю на уже работающей системе, то всё работает нормально.
В чём может быть дело?
Текст скрипта:
Код: Выделить всё
#! /bin/bash
DN=`dirname $0`
FN=`basename $2 .dat`
$1 $2
case $1 in
gzip)
SUFF=gz
;;
bzip2)
SUFF=bz2
;;
esac
echo DN=$DN, SUFF=$SUFF, $0 $@ >>/dev/shm/log.log
$DN/vlog $2.$SUFF >/Data/ARM/txt/$FN.TXT
echo $DN/vlog $2.$SUFF >/Data/ARM/txt/$FN.cmd
$DN/vlog $2.$SUFF | grep -e ^0702.01 -e ^0706 >./T_Log/txt/$FN.txt
$DN/vlog $2.$SUFF | grep -e ^0702.01 -e ^0706 | sed -r 's/[, ]+/,/'g >./T_Log/txt/$FN.csv
Строки с echo введены для отладки, чтобы убедиться, что параметры передаются правильно.
Каталог ./T_Log на самом деле ссылка на /Data/ARM. Не думаю, что это может играть роль.
P.S.
Попробовал это повторить дома. Работает нормально.