@dmitrymp3

Как поднять сервис с помощью bash скрипта?

История:
Ночью запускается сервер 1С, выполняется регламентное задание. Регламентное задание оставляет за собой логи в файле в кодировке ANSI. Этот лог забирается, конвертится, кладется в файл conv.txt.
Далее файл парсится grep'ом и как только в логе появляется фраза "Завершение обмена", сервер 1С (сервис) надо погасить (если дело происходит до 7 утра).
Для этого был написан простенький скрипт (с ним проблем нет):
#!/bin/bash

# Текущее время
var_time=`date`
var_hour=`date +%H`

# Час, до которого необходимо выполнять скрипт (обычно 7 утра, т.к. в 7.30 стартует сервер 1С)
dead_hour=21

a=/home/usr1cv8/1c_exchange_logs/reports/Exchange_\(95с1\)
b=`date '+%Y-%m-%d'`

# Входной файл
last_file=$a$b.txt

# Жестко заданный выходной файл конвертированный
conv=$HOME/conv.txt

# Файл логов
log_file=$HOME/shell_logs.txt

# Пишем в лог информацию о запуске скрипта
echo "---------------------------------------------------------"
echo "Скрипт запущен `date +%Y-%m-%d` в `date +%T`"
#echo "Скрипт запущен `date +%Y-%m-%d` в `date +%T`" >> $log_file

if [ -e $last_file ]
then
echo "Файл $last_file существует, запускаем его конвертацию"
iconv -f cp1251 -t utf8 $last_file -o $conv
echo "Файл сконвертирован"
else
echo "Файл $last_file отсутствует."
fi

# Считаем в переменную, сколько совпадений найдено grep'ом
var_grep=`grep -c "Завершение обмена" $conv`

# Если в grep'ом найдено больше нуля совпадений и время меньше чем 7.20 утра, то глушим сервер и делаем об этом запись в лог-файл
if [ $var_grep -gt 0 ]
then
echo "В файле $last_file найдено \"Завершение обмена\" $var_grep раз."
echo "Запускаем проверку времени"

if [ $var_hour -le $dead_hour ]
then
echo "Время меньше 7 утра"
echo "Останавливаем сервер 1С"
sudo service srv1cv83v18-1334 stop
else
echo "Время больше 7 утра"
echo "Сервер 1С остановлен не будет"
fi

else
echo "В файле $last_file не найдено \"Завершение обмена\""
fi

echo "---------------------------------------------------------"

Проблема:
Скрипт не работает на cron'e.
Если я его запускаю сам, типа:
sh script.sh - все прекрасно работает.
Но в какой крон я его не добавлял, никак оно не хочет работать.
Добавлял его в:
crontab -e
sudo crontab -e
/etc/crontab

Прописывал его в них как:
1  *    * * *   root   /home/user/script.sh
1 * * * * /home/user/script.sh
1 * * * * sudo /home/user/script.sh
1 * * * * sh /home/user/script.sh

И так далее. Ничего не работало.
Напрямую cron сервис и запускает и тормозит. В составе скрипта - никак.
Система:
18.04.1-Ubuntu
  • Вопрос задан
  • 161 просмотр
Решения вопроса 2
karabanov
@karabanov
Системный администратор
Впиши абсолютные пути до утилит и файлов.
Либо задай переменные окружения $PATH и $HOME.

Cron в Linux: история, использование и устройство
Ответ написан
shambler81
@shambler81 Куратор тега Linux
1. это ошибка всех кто работают с кроном. в нем нет переменных $PATH и нужно писать полный путь до интерпритаторов.
узнать ваш путь до команды легко
which sh
Вывод
/bin/sh

в моем случае это было бы
1 * * * * /bin/sh /home/user/script.sh
Так же не совсем понятно заем так все усложнять поему нельзя все это в потоке делать ?
Вы не просо следите еще и конвертите мало того еще и сохраняете на диск конвертированное, заем ?
А просто следить в потоке нет ?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Файлы вроде как у вас везде заданы с полным путем, но я подозреваю, что при запуске крона PATH не содержит всего чего нужно
В идеале было бы просто добавить в кроне скрипт с перенаправлением вывода ошибок и посмотреть логи, типа так

Попробуйте либо прописать полный путь к iconv и grep либо добавить в кроне перенаправление вывода в лог и посмотреть на что ругается скрипт
1 * * * * /bin/sh /home/user/script.sh>>$HOME/script.log 2>&1
Ответ написан
Комментировать
@Drno
так Вы прям в кроне укажите куда записать действия скрипта, там и увидите проблему я думаю
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы