Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: скрипт на проверку статуса сервиса  (Прочитано 1551 раз)

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

Оффлайн esgard

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
скрипт на проверку статуса сервиса
« : 29 Августа 2021, 21:23:30 »
Всем привет.
Ubuntu 16.04. У меня поднята вай-фай точка доступа через хостапд в связке с isc-dhcp-server. иногда драйвер вай-фай адаптера не грузится или грузится криво, либо грузится, но интерфейсу wlan0 не присваивается статический айпи-адрес. В любом из этих случаев, сервис isc-dhcp-server грузится со статусом "failed".
Я сделал скрипт проверки этого статуса и автоматический перезапуск драйвера адаптера, присвоение ему адреса и перезапуск сервисов hostapd и isc-dhcp-server.
(Нажмите, чтобы показать/скрыть)
Когда запускаешь скрипт из консоли, то проверка статуса сервиса идет корректно. Если он активен, то функция возвращает статус "good" и соответственно ничего не делает. Если сервис не запущен, либо имеет статус "failed", то функция возвращает статус "bad" и перезапускает драйвера и сервисы.
Пробовал и с правами su и логинится в консоль рута - все прекрасно. Но через планировщик задач от рута функция всегда возвращает статус "bad".
Не могу понять в чем дело.

Оффлайн bezbo

  • Старожил
  • *
  • Сообщений: 1742
    • Просмотр профиля
Re: скрипт на проверку статуса сервиса
« Ответ #1 : 29 Августа 2021, 21:28:06 »
планировщик задач

показывайте

Оффлайн esgard

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: скрипт на проверку статуса сервиса
« Ответ #2 : 29 Августа 2021, 21:42:56 »
*/5 * * * * /home/user/videoconf/checkstatus1 >> /home/user/videoconf/checkstatus.log
лог срабатывания планировщика задач:
*@ubuntu14:~$ cat videoconf/checkstatus.log
Вс авг 29 21:30:01 MSK 2021
Restarting isc-dhcp-server (via systemctl): isc-dhcp-server.service.
Restarting hostapd (via systemctl): hostapd.service.

isc-dhcp-server its bad
Вс авг 29 21:35:01 MSK 2021
Restarting isc-dhcp-server (via systemctl): isc-dhcp-server.service.
Restarting hostapd (via systemctl): hostapd.service.

isc-dhcp-server its bad

Оффлайн bezbo

  • Старожил
  • *
  • Сообщений: 1742
    • Просмотр профиля
Re: скрипт на проверку статуса сервиса
« Ответ #3 : 29 Августа 2021, 22:22:16 »
if [[ $check = '' ]];

попробуйте заменить на:
if [ -z "$check" ]
и объявите значение переменной до того, как её использовать: переместите checkIt "isc-dhcp-server" вверх
« Последнее редактирование: 29 Августа 2021, 22:27:57 от bezbo »

Оффлайн esgard

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: скрипт на проверку статуса сервиса
« Ответ #4 : 29 Августа 2021, 23:07:21 »
и объявите значение переменной до того, как её использовать: переместите checkIt "isc-dhcp-server" вверх
ругнулось что команда не найдена. videoconf/checkstatus1: строка 3: checkIt: команда не найдена Пришлось засунуть ее после объявления функции, там где она и была...
попробуйте заменить на:
Код: [Выделить]

if [ -z "$check" ]
да. Так получилось. Только теперь функция всегда возвращает статус "good", даже если сервис не запущен...
ПС: когда я запускаю его вручную, то он ругается на 8 строку:
videoconf/checkstatus1: строка 8: [: слишком много аргументов
8-ая - это соответственно изменная строка:

if [ -z "$check" ];
« Последнее редактирование: 29 Августа 2021, 23:24:06 от esgard »

Оффлайн valrust

  • Активист
  • *
  • Сообщений: 364
    • Просмотр профиля
Re: скрипт на проверку статуса сервиса
« Ответ #5 : 30 Августа 2021, 02:42:25 »
Предлагаю добавить переменную PATH в скрипт, что бы не зависеть от окружения планировщика.
Код: (bash) [Выделить]
#!/bin/bash

PATH=/usr/sbin:/usr/bin:/sbin:/bin

Предлагаю упростить проверку сервиса. Можно использовать код завершения (EXIT CODE) команды service. Если сервис запущен и работает, то команда service $1 status завершится с кодом завершения = 0, если будет ошибка, то код завершения НЕ будет = 0. Код завершения последней выполненной команды в bash доступен через специальный параметр $?.
Код: (bash) [Выделить]
service $1 status
local status=$?
if (( status != 0 ))

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6834
    • Просмотр профиля
Re: скрипт на проверку статуса сервиса
« Ответ #6 : 30 Августа 2021, 05:27:28 »
Любую программу можно улучшать бесконечно. Но первое, что мне бросилось в глаза:
Цитировать
sudo /sbin/modprobe...
Как cron вводит пароль?


Пользователь добавил сообщение 30 Августа 2021, 05:47:35:
Цитировать
[[ $check = '' ]]
Цитата отсюда:
Цитировать
z

строка "пустая", т.е. имеет нулевую длину
-n

строка не "пустая".   
Оператор -n требует, чтобы строка была заключена в кавычки внутри квадратных скобок. Как правило, проверка строк, не заключенных в кавычки, оператором ! -z, или просто указание строки без кавычек внутри квадратных скобок (см. Пример 7-6), проходит нормально, однако это небезопасная, с точки зрения отказоустойчивости, практика. Всегда заключайте проверяемую строку в кавычки. [18]
« Последнее редактирование: 30 Августа 2021, 05:47:35 от andytux »

Оффлайн Usermaster

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 2537
    • Просмотр профиля
Re: скрипт на проверку статуса сервиса
« Ответ #7 : 30 Августа 2021, 08:35:04 »
через планировщик задач от рута
Раз запускаете от рута, в скрипте во всех строках sudo не нужно.
Масло, масляное.

Оффлайн esgard

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Re: скрипт на проверку статуса сервиса
« Ответ #8 : 30 Августа 2021, 14:14:20 »
Раз запускаете от рута, в скрипте во всех строках sudo не нужно.
Масло, масляное.
Как cron вводит пароль?
Убрал sudo везде, вы верно написали.
    [[ $check = '' ]]

Цитата отсюда:
Цитировать

    z

    строка "пустая", т.е. имеет нулевую длину
    -n

    строка не "пустая".   
    Оператор -n требует, чтобы строка была заключена в кавычки внутри квадратных скобок. Как правило, проверка строк, не заключенных в кавычки, оператором ! -z, или просто указание строки без кавычек внутри квадратных скобок (см. Пример 7-6), проходит нормально, однако это небезопасная, с точки зрения отказоустойчивости, практика. Всегда заключайте проверяемую строку в кавычки. [18]
пробовал и так и эдак. Либо все время статус бэд, либо гууд.
Предлагаю добавить переменную PATH в скрипт, что бы не зависеть от окружения планировщика.
Код: (bash) [Выделить]

#!/bin/bash

PATH=/usr/sbin:/usr/bin:/sbin:/bin
переменная окружения тоже не помогла.

Предлагаю упростить проверку сервиса. Можно использовать код завершения (EXIT CODE) команды service. Если сервис запущен и работает, то команда service $1 status завершится с кодом завершения = 0, если будет ошибка, то код завершения НЕ будет = 0. Код завершения последней выполненной команды в bash доступен через специальный параметр $?.
Код: (bash) [Выделить]

service $1 status
local status=$?
if (( status != 0 ))
Забавно, но первоначальный скрипт выглядел именно так. И он не работал))
И у меня поначалу тоже не работал. переменная status возвращает код 0, скрипт выполнял условие как будто бы код был неравен 0.
Почистил все эти закомментированые строки и скрипт наконец заработал. Всем огромное спасибо.
итоговый рабочий скрипт выглядит так:
(Нажмите, чтобы показать/скрыть)

 

Страница сгенерирована за 0.029 секунд. Запросов: 25.