LINUX.ORG.RU

Sh скрипт и crontab

 , ,


1

3

Всем привет! Создал просто скрипт на sh. Никак не могу заставить его работать в кроне под root. Почему-то вместо выполнения, он шлет письмо руту. Прошу подсказать куда копать. Заранее спасибо!

#!/bin/sh
a=`/sbin/ifconfig | /bin/grep ppp0`
if [ -z "$a" ]; then
  echo "Inteface not exist"
 /sbin/pppd call ppp-peer
 sleep 5
 /sbin/ip route add 192.168.100.0/24 dev ppp0
                else
 echo "Inteface exist"
fi



Последнее исправление: b00B1uK (всего исправлений: 4)

#!/usr/bin/sh

а чо не в /home тогда уж?

не могу заставить его работать в кроне под root

без содержимого crontab — могу только тебе искренне посочувствовать

vedowi6419
()

Почему-то вместо выполнения, он шлет письмо руту.

Содержимое которого (я уверен, что с объяснением всего), мы, конечно, должны угадать?

#!/usr/bin/sh

Что это за дичь?!

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

После #! путь до интерпретатора. Что which sh сказал, то и пишу.)) Один фиг с #!/bin/sh тоже самое.

В crontab

          • /usr/bin/sh /usr/scripts/script.sh

Вот письмо.

Subject: Cron <root@nws> /usr/bin/sh
/usr/scripts/pptp_up_nws.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
Precedence: bulk
X-Cron-Env: <XDG_SESSION_ID=150>
X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/0>
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Date: Wed, 15 Jul 2020 13:17:01 +0000 (UTC)
Status: R

Inteface not exist
Cannot find device "ppp0"
b00B1uK
() автор топика
Ответ на: комментарий от vedowi6419

Хотя Вы правы. Дичь, действительно… Почему-то понадеялся на which sh

b00B1uK
() автор топика
Ответ на: комментарий от ugoday

Вот проверка.

a=/usr/sbin/ifconfig | /usr/bin/grep ppp0 if [ -z «$a» ]; then

Если переменная пустая (В Выводе нет ppp0), тогда исполняем команды. Еще раз, скрипт работает при ручном запуске. Не срабатывает именно через cron.

b00B1uK
() автор топика

a
grep
...

/sbin/ifconfig ppp0 1>/dev/null 2>/dev/null && echo exist || { /usr/sbin/pppd call ppp_peer ; и так далее ; }



sleep 5
/usr/sbin/ip route add 192.168.100.0/24 dev ppp0

А если он не поднялся?

else
echo «Inteface exist»

Тебе реально нужна тонна сообщений на почте о том, что интерфейс есть?

YAR ★★★★★
()
Последнее исправление: YAR (всего исправлений: 1)
Ответ на: комментарий от YAR

Тогда через минуту попробует снова) Крон по идее вызывает каждую минуту его.

Попробую Ваш, вариант, спасибо.

b00B1uK
() автор топика
Ответ на: комментарий от b00B1uK

Попробую Ваш, вариант, спасибо.

Это просто указание на некоторые моменты, которые можно не делать. Нет смысла создавать переменную и вызывать grep, когда можно просто смотреть код возврата.

Тогда через минуту попробует снова)

А можно просто дергать команду по факту реального поднятия ppp0. Не знаю, как в Centos, а в Debian можно просто положить файлик в /etc/ppp/ip-up.d/

YAR ★★★★★
()
Ответ на: комментарий от YAR

Задача в том, чтобы ppp0 поднимался при старте сервера или падении линка. Если использовать ip-up, то кто тогда вызовет сервер? Снова нужна задача в кроне. Кроме того, если сервер pptp перезагрузится и сбросит соединение, мой скрипт увидит, что упал интерфейс ppp0 и перезвонит.

Все равно не работает. Ваш вариант тоже через cron не запускается… Я уже ничего вообще не понимаю…

b00B1uK
() автор топика
Ответ на: комментарий от b00B1uK

Очевидно, нужно проверить, был ли успешен /usr/sbin/pppd call ppp_peer (скорее всего достаточно проверить $?), затем нужно узнать в каком состоянии ppp0 и если с ним всё в порядке уже добавлять маршрут.

Также помогает вывести на печать максимальное количество отладочной информации. Вдруг, pppd что-нибудь полезное говорит, а вы не в курсе.

ugoday ★★★★★
()
Ответ на: комментарий от b00B1uK

X-Cron-Env: <SHELL=/bin/sh>

Ну вот для начала.

Я бы весь этот скрипт написал так:

#!/bin/sh

if [ -f /tmp/yourscript.lock ]; then
  # Уже работает другой инстанс, не вмешиваемся
  exit
fi

while true; do
  if { /sbin/ifconfig | /bin/grep -q ppp0; } >/dev/null 2>&1; then
    # Всё в порядке, подчищаем за собой, завершаем цикл
    /bin/rm /tmp/yourscript.lock >/dev/null 2>&1
    break
  fi
  # Создаём лок-файл, чтобы сеть совсем не разворотило (читай выше и ниже)
  /usr/bin/touch /tmp/yourscript.lock
  # Делаем что нужно, в случае неудачи начинаем цикл заново (continue) не доходя до его конца
  /sbin/pppd call ppp-peer >/dev/null 2>&1 || continue
  /bin/sleep 5
  /sbin/ip route add 192.168.100.0/24 dev ppp0 >/dev/null 2>&1 || continue
  # Нужен ещё один проход цикла, так как проверку делаем в самом начале (читай выше)
done

Работу не гарантирую, мне тестировать не на чем.

* * * * * /usr/bin/sh /usr/scripts/script.sh

Лучше сделать скрипт исполняемым и прописать в crontab так:

* * * * * /usr/scripts/script.sh

Иначе зачем тебе в самом скрипте шебанг?

Что which sh сказал, то и пишу.

Во-первых which -a sh, во-вторых нужно проверять пути на реальность (симлинки, мёртвые файлы и просто нерабочий трэш. Если уж делать системные скрипты, то и шелл использовать нормальный. Не знаю как в CentOS, но во всех нормальных UNIX-like POSIX Shell лежит по пути /bin/sh. В Linux это обычно симлинк на /bin/bash, который работает в режиме совместимости.

---

Для дебага убери все >/dev/null 2>&1 из скрипта, когда заставишь работать — верни их обратно.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Ваш вариант работает отлично) НО… Не через cron))) В кроне прописал его * * * * * /usr/scripts/ppp.sh Не срабатывает. Ничего не понимаю.

b00B1uK
() автор топика
Ответ на: комментарий от b00B1uK

В кроне прописал его * * * * * /usr/scripts/ppp.sh Не срабатывает.

Что пишет ls -l /usr/scripts/ppp.sh?

UPD: В каком именно crontab? Если системный (/etc/crontab), то у него другой синтаксис, нужно указывать пользователя, от которого crond будет запускать задачу:

* * * * * root /usr/scripts/ppp.sh

Но если скрипт не является исполняемым, это всё равно ничего не изменит.

mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)
Ответ на: комментарий от mord0d
[root@nws scripts]# ls -lta
total 12
drwxr-xr-x   2 root root   59 Jul 15 17:00 .
-rwxr-xr-x   1 root root 1013 Jul 15 17:00 ppp.sh
-rwxrwxrwx   1 root root  200 Jul 15 15:59 pptp_up.sh
drwxr-xr-x. 14 root root  170 Jul 15 11:54 ..

Вписываю задание в crontab -e, из под рута.

P.S. Как Вы редактируете свои сообщения?) У меня нет такой кнопки, но очень бы хотелось))

b00B1uK
() автор топика
Ответ на: комментарий от b00B1uK

Вписываю задание в crontab -e, из под рута.

Тогда всё нормально.

-rwxr-xr-x   1 root root 1013 Jul 15 17:00 ppp.sh

И здесь всё нормально.

Может быть что-то специфичное для CentOS.

Но на всякий случай ещё можно проверить allow/deny для crond (эти списки находятся в разных местах в зависимости от реализации и иногда опций сборки; об этом обычно пишут в crontab(1) (man 1 crontab)).

P.S. Как Вы редактируете свои сообщения?) У меня нет такой кнопки, но очень бы хотелось))

Возможность редактировать свои комментарии (редактировать пост можно всем зарегистрированным) доступна то ли с одной (зелёной?) звезды, то ли с двух, я уже не помню. Собственно, это единственная причина набирать score на ЛОРе. ☺

mord0d ★★★★★
()
Ответ на: комментарий от b00B1uK

Если использовать ip-up, то кто тогда вызовет сервер? Снова нужна задача в кроне.

Я не отменял необходимость cron'а, я лишь за то, чтобы перенести создание маршрута туда, где оно более логично.

За persist уже сказали выше.

Создавать подключение можно, описав интерфейс в /etc/network/interfaces

Скрипт, в принципе, особо не нужен :)

YAR ★★★★★
()
Ответ на: комментарий от YAR

Собственно решил вопрос без скрипта)) НО, так и не удалось понять почему кронтаб не отрабатывает скрипт))))

Решил через настройку интерфейса через ifcfg-ppp0 и route-ppp0 в /etc/sysconfig/network.

b00B1uK
() автор топика
Ответ на: комментарий от b00B1uK

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

В первых сообщениях ты писал, что шлется почта с ошибкой. Значит, сам скрипт выполнялся, вопрос только к содержимому. Тогда и отлавливай ошибки работы - или на почте, или сделай перенаправление в crontab'e для удобства (* * * * * /path/to/script.sh 1>/tmp/out.list 2>/tmp/err.list), а скрипт сделай максимально «разговорчивым», как уже написали выше.

YAR ★★★★★
()
Ответ на: комментарий от YAR

А как же квест? :)

Прежде чем задавать такие вопросы, сделай его сам. ^_~ Тем более половина уже сделана.

mord0d ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.