[Решено] Crontab не выполняет некоторые скрипты

Автор Boris888, 29 сентября 2016, 14:28:06

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Boris888

Crontab не выполняет некоторые скрипты
Подскажите в чем дело, крон выборочно делает только часть заданий

Например, такой скрип выполняет (пинг роутера и запись ответа в файл)

echo "909"
LOCKFILE=/home/800/999.txt
data555=$(date +"%Y_%m_%d_%H%M%S")
a=`ping -c1 -I wlan0 192.168.1.1`

echo $data555 $a >> ${LOCKFILE}
echo "  " >> ${LOCKFILE}


а вот такой не хочет выполнять (скрипт просто читает файл, ищет переменную AAA= и добавляет счетчик на +1, т.е. было AAA=5 стало AAA=6)
#echo "930"
#create TEST FILE
PLUSFILE=/home/800/000.txt
data777=$(date +"%Y-%m-%d %H:%M:%S")

#file - not found = Alarm8=0
#file - exist = Alarm8 is file + 1
Alarm8=0

#find file
if [ -e ${PLUSFILE} ] ; then
  echo "read  file: " $PLUSFILE

#read string-1
{
read S1
read S2
} < $PLUSFILE
echo "S1: " $S1

#find AAA=
ab1="AAA="

for ((i=0; i < ${#S1} ; i++)) do
  ab2=${S1:i:4}
  #echo $ab2
 
  if [[ $ab1 = $ab2 ]] ; then
      #echo "+ + + + + + + =" $i
      Alarm8=${S1:i+4:4}
      echo $Alarm8
  fi
done   
       
else
  echo "file not found - create file: " $PLUSFILE
  #create file
  echo $data777 10.20.30.40 time=50 "AAA="$Alarm8 " " >  ${PLUSFILE}

fi


Alarm8=$(($Alarm8+1))

#change file
echo $data777 10.20.30.40 time=50 "AAA="$Alarm8 " " >  ${PLUSFILE}
#echo "  " >> ${PLUSFILE}



Вот что написано после невыполненного скрипта
/var/log/syslog
Sep 29 14:08:01 raspberrypi /usr/sbin/cron[2265]: (*system*) RELOAD (/etc/crontab)
Sep 29 14:08:01 raspberrypi /USR/SBIN/CRON[2710]: (root) CMD (   /bin/930)
Sep 29 14:08:01 raspberrypi /USR/SBIN/CRON[2709]: (CRON) info (No MTA installed, discarding output)


В консоли при ручном запуске все скрипты выполняются !
Скрипты лежат в папке /bin
При выполнении в консоли просто пишу 909 или 930

Права на папку /home/800 выставлены 0777
Вот файл
/etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command

08 *    * * *   root    /bin/930 #не работает
09 *    * * *   root    /bin/909 #работает


используй теги code
alsoijw

alsoijw

Boris888, а что скрипт должен делать? Я не нашёл там ни одного намёка на ping.
Зы выровняй код, у тебя там в некоторых местах нет отступов.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

ogost

echo выводит сообщение на stdout, то бишь на консоль, а при запуске крона куда уйдут сообщения?

Boris888

#3
я выложил два скрипта 909 это пинг с записью в файл - скрипт работает
а 930 это чтение файла и запись этого же файла с изменением (пингов там нет, просто пример того что у меня не получилось) - не работает

я удалил все "echo в консоль" проверил: при запуске ничего не сообщает - крон все равно не выполняет этот скрипт.

вот сообщение в /var/log/syslog
Sep 29 20:57:02 raspberrypi /usr/sbin/cron[2265]: (*system*) RELOAD (/etc/crontab)
Sep 29 20:57:02 raspberrypi /USR/SBIN/CRON[3763]: (root) CMD (   /bin/930)
Sep 29 20:57:02 raspberrypi /USR/SBIN/CRON[3762]: (CRON) info (No MTA installed, discarding output)

ogost

На первый взгляд криминала в скрипте не видно. Крон обычно при ошибке выполнения команды шлет мыло руту (ну или определенному юзеру) с описанием проблемы, что-то вроде локальной почтовой системы. А MTA у вас не установлен (судя по выводу у вас raspbian, видимо у них это не предустановлено), поэтому почта не приходит, поэтому в syslog такие сообщения. Проверьте установлен ли exim4, если не ошибаюсь, то exim-daemon-light (exim-daemon-heavy, если опять же не ошибаюсь, используется на полноценных почтовых серверах).

endru

#5
Цитата: alsoijw от 29 сентября 2016, 15:59:06Зы выровняй код, у тебя там в некоторых местах нет отступов.
Это не питон.
Boris888, что за непонятные циклы? если все лишние строки отбросить получится:
#!/bin/bash
PLUSFILE=/home/800/000.txt
data777=$(date +"%Y-%m-%d %H:%M:%S")
Alarm8=0
if [ -e ${PLUSFILE} ] ; then
        Alarm8=`awk '{print $5}' $PLUSFILE | sed 's/AAA=//g'`
fi
Alarm8=$(($Alarm8+1))
echo $data777 10.20.30.40 time=50 "AAA="$Alarm8 " " >  ${PLUSFILE}

Boris888

Большое спасибо ! Теперь всё работает, и код короче моего в 5 раз !
и в Кроне тоже работает.

я на Линуксе (Raspberry) всего пол года сижу (да и то по выходным), все что я написал взял на основе
http://www.opennet.ru/docs/RUS/bash_scripting_guide/c4875.html#LOOPS1
там подробно про циклы и ветвления написано, по русски более подробно я нигде не нашел.

я только строку не понял которую Вы мне написали
Alarm8=`awk '{print $5}' $PLUSFILE | sed 's/AAA=//g'`

а у меня проблема была отсутствии отступов ? в консоли почему то мой (нерациональный) код выполнялся правильно.

endru

#7
Boris888, проблема возможно в интерпретаторе, я не знаю какой используются в "малинке" по умолчанию. Поэтому рекомендую жестко прописывать интерпретатор!
Пишешь скрипт на баше? - Указывай это в первой строке скрипта #!/bin/bash
В каждом интерпретаторе есть свои небольшие тонкости...

Проверить какой интерпретатор используется в консоли а какой в кроне можно командой:
echo $SHELL
сделай перенаправление вывода в файл, например, и посмотри что ответит cron

Cообщение объединено 30 сентября 2016, 12:31:32

Цитата: Boris888 от 30 сентября 2016, 11:49:13я только строку не понял которую Вы мне написали
Alarm8=`awk '{print $5}' $PLUSFILE | sed 's/AAA=//g'`
AWK мощный инстумент, рекомендую прочитать про него и про SED.
конкретно в этом примере awk '{print $5}' $PLUSFILE считывает файл и берет из него только 5 колонку, разделителем данных в данном случае будет "пробел", можно указывать любой друго разделитель с помощью ключа -F.
Дальше sed 's/AAA=//g' - удаляет не нужные AAA= из переменной
Открыть содержимое (спойлер)
разбираем исходные данные: имеем файл с содержанием: 2016-09-30 10:54:16 10.20.30.40 time=50 AAA=30, после применения:
awk '{print $5}' $PLUSFILE
получим результат:
AAA=30
Дальше нам нужно оставить только цифры, с помощью конвеера и sed удаляем лишнии символы:
awk '{print $5}' $PLUSFILE | sed 's/AAA=//g'
30
[свернуть]

alsoijw

Цитата: endru от 30 сентября 2016, 06:55:02Это не питон.
Я проверял скрипт на остутствии некоторых ошибок. Я не умею читать не отформатированный код.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?


Boris888

#10
а подскажите как перенаправить вывод в файл,
у меня около 20 скриптов для автоматизации сети, L2TP, и фотографий в заданное время.
в Кроне работает примерно 2 из 20
в консоли при ручном наборе все великолепно работает...

а мне до моей "Малины" ехать 7 километров при отключении VPN-L2TP
чтобы просто набрать там команду (почему то несколько раз... в этом и причина писания скриптов)
/etc/init.d/networking restart

root@raspberrypi:/# echo $SHELL
/bin/bash

alsoijw

Boris888, имя-команды > путь\ к\ файлу

Cообщение объединено 01 октября 2016, 22:18:35

"\ " это я пробелы экранировал
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Boris888

#12
скопировал с действующего скрипта, и поставил в начало нерабочего скрипта (хотя там и стояло, но кажется с пробелом в начале)
#!/bin/bash

теперь у меня работает даже мой первый скрипт, который был слишком длинно и нерационально написан.
Ура - все получилось !