Образование файла 0 размера 0 при запуске скрипта через cron

Языки программирования, IDE, компиляторы, интерпретаторы, гипервизоры и виртуальные среды
Правила форума
Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
madesta
Сообщения: 1069
Зарегистрирован: 11 июн 2017, 18:47
Решено: 12
Благодарил (а): 43 раза
Поблагодарили: 254 раза

Образование файла 0 размера 0 при запуске скрипта через cron

Сообщение madesta » 13 мар 2021, 11:39

Имеется 4 компьютера с идентичной ОС LM20.1 xfce При старте каждой из их запускается warpinator
Чтобы warpinator не "молотил" когда все остальные компьютеры выключены каждые 30 минут проверяется доступность других компьютеров. Если имеется хотя бы один ответ, то warpinator продолжает работать. Если нет ответа ни от одного из остальных компьютеров, то подаётся команда на выключение warpinator
*/30 * * * * /home/minter/Dropbox/scripts/modules/warp-cron.sh

warp-cron.sh
Проверка состояния warpinator: включен/выключен. Если включен, то переход к проверке доступности сетевых узлов.
#!/bin/bash
do=/home/minter/Dropbox/scripts
info=$do/temp/warpinator.txt
if [ $(pgrep warpinator)>'0' ];
then
echo "1" > $info
else
echo "0" > $info
fi
value=`cat $info`
if [ $value -eq 0 ];
then
:
else
$do/modules/warp-check-net.sh
fi
exit

warp-check-net.sh проверяет сетевые узлы через ответ ping по именам хостов (компьютеров). Имена хостов сопоставлены IP через DNS. При положительном ответе записывается значение 1, при отрицательном - 0. Далее производится суммирование ответов, которое потом считывается. Если сумма равна 0 (нет ответов от хостов), то warpinator выключается.
#!/bin/bash
day=`date '+%d'`
do=/home/minter/Dropbox/scripts
log=/home/minter/Reports/system/$day.txt
if ping -c 1 H-3.vot &> /dev/null;
then
echo "1" > $do/temp/h-3.txt
else
echo "0" > $do/temp/h-3.txt
fi
if ping -c 1 H-2.vot &> /dev/null;
then
echo "1" > $do/temp/h-2.txt
else
echo "0" > $do/temp/h-2.txt
fi
if ping -c 1 H-8.vot &> /dev/null;
then
echo "1" > $do/temp/h-8.txt
else
echo "0" > $do/temp/h-8.txt
fi
h2=`cat $do/temp/h-2.txt`
h3=`cat $do/temp/h-3.txt`
h8=`cat $do/temp/h-8.txt`
echo "$(( $h2 + $h3 + $h8 ))" > $do/temp/all.txt
net=`cat $do/temp/all.txt`
if [ $net -eq 0 ];
then
$do/modules/warp-stop.sh
else
time=`date '+%H.%M.%S'`
echo "$time -- warpinator is active" >> $log
fi
exit

Выключение warpinator warp-stop.sh
#!/bin/bash
day=`date '+%d'`
log=/home/minter/Reports/system/$day.txt
warp="$(pidof warpinator)"
kill -15 ${warp}
time=`date '+%H.%M.%S'`
echo "$time -- warpinator stoped" >> $log
export DISLPAY=:0 && notify-send --icon=/home/minter/.local/share/icons/gnome/48x48/emblems/emblem-info3-violet.png "Остановка Warpinator"
exit

Всё работает как задумано. Но при срабатывании скрипта в корневом каталоге образуется файл с именем 0 размером 0 При этом если скрипт запустить не через cron, а просто выполнить, то никакого файла с именем 0 размером 0 не создаётся. Самостоятельно не удаётся найти причину генерации файла 0

Решение slant » 13 мар 2021, 12:54
Глядя на код - плакал кровавыми слезами.
madesta писал(а):
13 мар 2021, 11:39
warp-cron.sh
Это... я даже не знаю как сказать, чтобы самого себя не банить потом.

Слушай, почитай man pidof
Вместо всего этого кошмара:

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

#!/bin/bash
do=/home/minter/Dropbox/scripts
pidof warpinator && $do/modules/warp-check-net.sh
Последняя строка: "если первая команда успешна - выполнить вторую". У pidof "успех" - найденный по имени процесс, один или более. Это т.н. exitcode, а не вывод на экран. exitcode присутствует почти у всех команд и позволяет проверить удачно ли закончился их вызов.

Остальные скрипты тоже с кучей избыточного.
В частности есть команда killall которая принимает не pid процесса а имя команды/программы.

Для warp-check-net.sh, кусок для проверки:

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

....
CH=""
ping -c 1 H-1.vot && CH="1"
ping -c 1 H-2.vot && CH="$CH 2"
ping -c 1 H-3.vot && CH="$CH 3"
ping -c 1 H-4.vot && CH="$CH 4"
if [ -n $CH ];
then 
$do/modules/warp-stop.sh
....  
Для ping - успех - наличие хоста.
Конструкция CH="$CH 2" - добавит двойку через пробел к текущей переменной (текст).
if [ -n $CH ] - истинно, если переменная содержит какой-то текст (длинна строки более 0). А это случится если хоть один хост откликнется. В принципе пофиг какие символы добавлять в переменную - цифры для наглядности.

Перейти к ответу ➙

Аватара пользователя

symon2014
Сообщения: 5135
Зарегистрирован: 16 дек 2017, 18:59
Решено: 29
Откуда: Феодосия
Благодарил (а): 31 раз
Поблагодарили: 639 раз

Образование файла 0 размера 0 при запуске скрипта через cron

Сообщение symon2014 » 13 мар 2021, 11:56

Не по теме
Так и хочется ляпнуть - &> /dev/null; :-D

Аватара пользователя

slant
Сообщения: 3249
Зарегистрирован: 21 июн 2017, 15:09
Решено: 58
Благодарил (а): 39 раз
Поблагодарили: 1368 раз

Образование файла 0 размера 0 при запуске скрипта через cron

Сообщение slant » 13 мар 2021, 12:54

Глядя на код - плакал кровавыми слезами.
madesta писал(а):
13 мар 2021, 11:39
warp-cron.sh
Это... я даже не знаю как сказать, чтобы самого себя не банить потом.

Слушай, почитай man pidof
Вместо всего этого кошмара:

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

#!/bin/bash
do=/home/minter/Dropbox/scripts
pidof warpinator && $do/modules/warp-check-net.sh
Последняя строка: "если первая команда успешна - выполнить вторую". У pidof "успех" - найденный по имени процесс, один или более. Это т.н. exitcode, а не вывод на экран. exitcode присутствует почти у всех команд и позволяет проверить удачно ли закончился их вызов.

Остальные скрипты тоже с кучей избыточного.
В частности есть команда killall которая принимает не pid процесса а имя команды/программы.

Для warp-check-net.sh, кусок для проверки:

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

....
CH=""
ping -c 1 H-1.vot && CH="1"
ping -c 1 H-2.vot && CH="$CH 2"
ping -c 1 H-3.vot && CH="$CH 3"
ping -c 1 H-4.vot && CH="$CH 4"
if [ -n $CH ];
then 
$do/modules/warp-stop.sh
....  
Для ping - успех - наличие хоста.
Конструкция CH="$CH 2" - добавит двойку через пробел к текущей переменной (текст).
if [ -n $CH ] - истинно, если переменная содержит какой-то текст (длинна строки более 0). А это случится если хоть один хост откликнется. В принципе пофиг какие символы добавлять в переменную - цифры для наглядности.

Аватара пользователя

Автор темы
madesta
Сообщения: 1069
Зарегистрирован: 11 июн 2017, 18:47
Решено: 12
Благодарил (а): 43 раза
Поблагодарили: 254 раза

Образование файла 0 размера 0 при запуске скрипта через cron

Сообщение madesta » 13 мар 2021, 22:08

slant писал(а):
13 мар 2021, 12:54
Глядя на код - плакал кровавыми слезами.
Право, не стоит воспринимать так близко к сердцу самопал для личного внутреннего потребления. Признаю, что когда Всевышний одаривал подарками, мне ума не досталось. Но всё равно пытаюсь каким-то образом "барахтаться", чтобы окончательно мои пенсионные мозги не атрофировались. Хотя какие там мозги: одна извилина и то, знаете, от чего след ... :-D

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

Аватара пользователя

rogoznik
Сообщения: 8478
Зарегистрирован: 27 июн 2017, 10:36
Решено: 93
Откуда: Нижний Тагил
Благодарил (а): 550 раз
Поблагодарили: 1543 раза

Образование файла 0 размера 0 при запуске скрипта через cron

Сообщение rogoznik » 14 мар 2021, 04:59

madesta писал(а):
13 мар 2021, 22:08
тему можно закрыть.
Давно пора самому научиться закрывать свои темы
ИзображениеИзображение

Вернуться в «Программирование, скриптинг, виртуализация»