Ad Widget

Collapse

Timeout while executing a shell script.

Collapse
This topic has been answered.
X
X
 
  • Time
  • Show
Clear All
new posts
  • teddy
    Senior Member
    • Dec 2017
    • 234

    #1

    Timeout while executing a shell script.

    Коллеги!
    мне нужно запустить по событию скрипт, который выполняется сравнительно долго. т.е дольше положенных 30 сек. сколько именно не важно. результат этого скрипта возвращать в zabbix мне не нужно, скрипт должен выполнить действие на системе.
    в shell я запускаю
    #my_scripts.sh &
    и время отработки такого события - доли секунды, не смотря на то что сам скрипт может выполняться и часами. в фоне.
    При попытке запуска такого скрипта "из под" zabbix я имею Timeout while executing a shell script.
    Такое впечатление что zabbix не реагирует на знак & и продолжает ожидать окончание не только основного процесса но и всех порожденных.
    Что поправить чтобы ошибок не было?

    ZabbixServer 6.4.7 ( Linux ), Zabbix Agent 2 6.4.7 ( Linux )
    Last edited by teddy; 10-10-2023, 08:06.
  • Answer selected by Kos at 11-10-2023, 10:31.
    Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    Если я правильно понимаю то, что написано в документации (ссылка), то дочерний долгоиграющий процесс должен закрыть свои stdout и stderr.
    Попробуйте при вызове вашего скрипта указать:
    Code:
    my_scripts.sh >/dev/null 2>&1 &

    Comment

    • Kos
      Senior Member
      Zabbix Certified SpecialistZabbix Certified Professional
      • Aug 2015
      • 3404

      #2
      Если я правильно понимаю то, что написано в документации (ссылка), то дочерний долгоиграющий процесс должен закрыть свои stdout и stderr.
      Попробуйте при вызове вашего скрипта указать:
      Code:
      my_scripts.sh >/dev/null 2>&1 &

      Comment

      • teddy
        Senior Member
        • Dec 2017
        • 234

        #3
        Спасибо, выставил - вроде бы оно. В боевых условиях проверю ночью.

        Comment

        • teddy
          Senior Member
          • Dec 2017
          • 234

          #4
          Тыкс. Решение рабочее. Можно использовать при надобности
          Причем у меня раньше было
          /etc/zabbix/scripts/my_scripts.sh >/tmp/result.tmp &
          и в таком режиме zabbix ждал окончания дочернего процесса.

          А в таком варианте не ждет. Т.е основным вопросом было stderr.
          /etc/zabbix/scripts/my_scripts.sh >/tmp/result.tmp 2>/dev/null &

          Comment

          • Kos
            Senior Member
            Zabbix Certified SpecialistZabbix Certified Professional
            • Aug 2015
            • 3404

            #5
            Спасибо за экспериментальную проверку, будем знать!
            У меня ещё были подозрения, не нужно ли добавить в начале строки nohup; но если работает без него - то и ладно

            Comment

            • teddy
              Senior Member
              • Dec 2017
              • 234

              #6
              Originally posted by Kos
              Спасибо за экспериментальную проверку, будем знать!
              У меня ещё были подозрения, не нужно ли добавить в начале строки nohup; но если работает без него - то и ладно
              nohup было первое что я попробовал. само по себе оно не дает никакой разницы с простым & в конце.

              Comment

              • Alex_UUU
                Senior Member
                • Dec 2018
                • 541

                #7
                Работаю давно с таким процессом запускаю через system.run[script -1 &>scrript.log,nowait]
                Скрипт работает постоянно.
                В самом скрипте проверяю запущен ли он уже. Дальше в других ЭД обрабатываю создаваемый файл логов, Также логично скрипт пишет еще в отдельный файл пид процесса, чтобы можно было убить, если что.

                Comment

                • teddy
                  Senior Member
                  • Dec 2017
                  • 234

                  #8
                  Да, конструкция cmd &>txt заменяет cmd 1>txt 2>txt. Я так понял что важно именно чтоб stdout и stderr не оставлять за консолью, которая закроется только при выходе из последнего по вложенности дочернего скрипта.
                  А при записи в файл поток каждый раз файл открывает и закрывает по окончании вывода строки. Это подтверждает и возможность удалить такой файл txt до окончания всех записей. при следующей записи файл просто продолжит писать вывод...
                  И главное это не мешает заббиксу посчитать что вызов shell закончен по завершении родительского процесса.
                  Вообще вся эта кухня так работает на Linux. Надо будет попробовать проверить все на Windows. там работа с потоками stdout, stderr другая, и могут быть другие результаты

                  Comment

                  • Alex_UUU
                    Senior Member
                    • Dec 2018
                    • 541

                    #9
                    У меня демон на Перле написан, ничего с потоками не делаю, только поставил их в бин режим для кодировки УТФ8.
                    Когда была задача из этого скрипта (который по nowait) висит запускать еще один демон и из него получать данные - вот тут переопределял потоки, правда только внутренние.
                    Ну и права на все общие файлы должны быть правильными. (часто бывает - тестируешь скрипт, по рутом или собой, все ок, файл создался. запускаешь заббиксом - и проблема. Права на файл-то чужие)

                    Comment

                    Working...