Плохо работает скрипт.

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
MiK13
Сообщения: 1164
ОС: Linux Debian

Плохо работает скрипт.

Сообщение MiK13 »

Здравствуйте!
Система АРМ, которой мы занимаемся, построена, кратко, так: при загрузке 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.
Попробовал это повторить дома. Работает нормально.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Плохо работает скрипт.

Сообщение ormorph »

Название FILE фиксированное, или оно меняется в вызове system()?
Ну и не знаю привели оригинал скрипта или нет, а так директорию DN сделайте фиксированной, а не командой dirname $0.
Так как указывается не та директория нахождения программы vlog, по этому у вас просто записываются пустые файлы.
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Плохо работает скрипт.

Сообщение MiK13 »

ormorph писал(а):
14.01.2018 10:38
Название FILE фиксированное, или оно меняется в вызове system()?
Меняется. Но это не имеет значения

ormorph писал(а):
14.01.2018 10:38
Ну и не знаю привели оригинал скрипта или нет, а так директорию DN сделайте фиксированной, а не командой dirname $0.
Так как указывается не та директория нахождения программы vlog, по этому у вас просто записываются пустые файлы.
Нет, тут что-то другое. Директории те, я проверял с помощью команды echo.
Сейчас решил запустить программу vlog через strace. И вот что получил...
Решил привести результат трассировки, но потом передумал.
Результат показал, что программа вылетает по ошибке SIGSEGV.
Проанализировал программу и понял, что она вылетает на перекодировке знака градуса (°) из UTF-8 в то, что определено текущей локалью.
А локаль в этом скрипте ещё не определена.
Правда, возникли ещё некоторые проблемы, но думаю, что решу их сам.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Плохо работает скрипт.

Сообщение Bizdelnick »

Буду краток: man logrotate.
И вообще syslog надо было с самого начала использовать, а не изобретать велосипеды.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Плохо работает скрипт.

Сообщение Bizdelnick »

По скрипту: начните с использования двойных кавычек вокруг всех строк, содержащих переменные.

Код: Выделить всё

#! /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"
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить