Ad Widget

Collapse

Проблема при запуске скриптов PS со start-job

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • xeonkeeper
    Junior Member
    • Sep 2012
    • 27

    #1

    Проблема при запуске скриптов PS со start-job

    Есть долговыполняющийся скрипт,который отсылает данные в trapper.
    Чтобы обойти ограничение в 30 сек, решил выполнять скрипт через start-job в powershell. Проблема в том, что job не стартует при вызове скрипта удаленно через zabbix_get (хотя возвращает данные о том, что был запущен). При выполнении локально под пользователем job корректно стартует и отсылает дынные в trapper. Грешу на какие то права, вот только не могу понять какие могут ему понадобиться.
  • sadman
    Senior Member
    • Dec 2010
    • 1611

    #2
    Originally posted by xeonkeeper
    Грешу на какие то права, вот только не могу понять какие могут ему понадобиться.
    Для начала запустите zabbix_agentd с правами аккаунта, который гарантированно обеспечивает результат.

    Совсем непонятно, как вы определяете, что "job не стартует", если "возвращает данные о том, что был запущен".

    Что делает скрипт - в сеть ходит?


    ...у Start-Job есть опции -Authentication и -Credential - они помогают исправить ситуацию?
    Last edited by sadman; 10-11-2016, 07:50.

    Comment

    • xeonkeeper
      Junior Member
      • Sep 2012
      • 27

      #3
      в общем ситуация такая, для проверки создал простейший
      Code:
      start-job {sleep 60}
      запустил zabbix_agend под пользователем, под которым все работает, когда я запускаю скрипт из ISE.

      после запуска из ISE делаю get-job и вижу
      14 Job14 BackgroundJob Running True localhost sleep 60

      после запуска через zabbix_get, агент мне отвечает, что
      1 Job1 BackgroundJob Running True localhost


      но, делая на клиенте get-job я запущенных заданий не вижу

      Comment

      • sadman
        Senior Member
        • Dec 2010
        • 1611

        #4
        Originally posted by xeonkeeper
        Code:
        start-job {sleep 60}
        запустил zabbix_agend под пользователем, под которым все работает, когда я запускаю скрипт из ISE.
        Ну, а DebugLevel=4 что дает в лог агенту?

        Comment

        • xeonkeeper
          Junior Member
          • Sep 2012
          • 27

          #5
          Originally posted by sadman
          Ну, а DebugLevel=4 что дает в лог агенту?

          да в принципе ничего необычного

          Code:
            5948:20161110:133100.019 Requested [PSScript[getcriticalupdate.ps1]]
            8464:20161110:133100.191 In collect_perfstat()
            8464:20161110:133100.191 End of collect_perfstat()
            5948:20161110:133101.175 Run remote command [powershell -File "C:\Program Files\Zabbix Agent\scripts\getcriticalupdate.ps1"] Result [242] [
          
          Id     Name       ]...
            5948:20161110:133101.175 Sending back [
          
          Id     Name            PSJobTypeName   State         HasMoreData     Location  
          
          --     ----            -------------   -----         -----------     --------  
          
          1      Job1            BackgroundJob   Running       True            localhost]

          Comment

          • karik-himik
            Senior Member
            • Oct 2015
            • 116

            #6
            Пожет проблема всё-таки не в правах, а в том,что вы запускаете Job из PowershellISE, а статус get-job выполняете из агента, который в свою очередь запускает уже не ISE, а консоль powershell ? Соответственно это разные сессии. Не могу сказать точно, но есть вероятность, что джобы одной сессии не видны в другой.

            Попробуйте для начала выполнить start-job в одной powershell консоли, а get-job из другой. Получите вы список джобов ?

            Comment

            • xeonkeeper
              Junior Member
              • Sep 2012
              • 27

              #7
              Originally posted by karik-himik
              Пожет проблема всё-таки не в правах, а в том,что вы запускаете Job из PowershellISE, а статус get-job выполняете из агента, который в свою очередь запускает уже не ISE, а консоль powershell ? Соответственно это разные сессии. Не могу сказать точно, но есть вероятность, что джобы одной сессии не видны в другой.

              Попробуйте для начала выполнить start-job в одной powershell консоли, а get-job из другой. Получите вы список джобов ?

              Тоже думал в эту сторону, создал скрипт с get-job и так же запускал его через zabbix_get после "запуска" скрипта. Ничего не показывает.
              действительно, джобы других сессий не видны в других.

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

              Comment

              • uniken1
                Member
                • Sep 2012
                • 93

                #8
                Пробовал powershell for Exchange для состояния баз, клинтов и т.д., максимального таймаута в 30 сек. обычно не хватает. Переделал item на trapper, а powershell скрипт запускаю из Task Scheduler. Так заработало.
                Так же в Task Scheduler удобен тем, что можно выставить условие, чтобы новое задание не запускалось пока не закончилось предыдущее.

                Comment

                • karik-himik
                  Senior Member
                  • Oct 2015
                  • 116

                  #9
                  Не совсем понимаю, какие данные Вы ждете от zabbix_get, если Ваш скрипт в результате вызывает zabbix_sender и передает данные в Тип элемента Zabbix Траппер ?
                  Zabbix_get нужен для проверки Типов Zabbix Агент и Zabbix Агент активный.

                  Как Вы собираетесь в дальнейшем этот PS скрипт запускать ? Через скрипт из карты сети zabbix ? или как ?

                  Если всё равно в конечном итоге Ваш скрипт вызывает zabbix_sender, то может проще его запускать из планировщика ?

                  Comment

                  • xeonkeeper
                    Junior Member
                    • Sep 2012
                    • 27

                    #10
                    Originally posted by karik-himik
                    Не совсем понимаю, какие данные Вы ждете от zabbix_get, если Ваш скрипт в результате вызывает zabbix_sender и передает данные в Тип элемента Zabbix Траппер ?
                    Zabbix_get нужен для проверки Типов Zabbix Агент и Zabbix Агент активный.

                    Как Вы собираетесь в дальнейшем этот PS скрипт запускать ? Через скрипт из карты сети zabbix ? или как ?

                    Если всё равно в конечном итоге Ваш скрипт вызывает zabbix_sender, то может проще его запускать из планировщика ?

                    по сути zabbix_get мне нужен только для того, чтобы запустить скрипт, в последующем через обычный item. Какую информацию он мне вернет мне совершенно не важно. Мне надо чтобы он отработал и отослал данные в trapper.
                    Через шедулер проще, но не совсем то, что нужно. Необходимо управлять временем запуска с frontend'а Zabbix.
                    Если есть более красивое решение, готов попробовать.

                    Пока нашел только это, но тоже не годится, так как большое количество серверов, а большое количество внешних проверок не рекомендовано.
                    Join the friendly and open Zabbix community on our forums and social media platforms.



                    ПС. Сейчас проверил, скрипт отрабатывает корректно с повышенными привилегиями и с обычными из консоли powershell.

                    Но через zabbix_get никак.

                    Оставил из скрипта только отправку в trapper

                    Так не работает
                    Code:
                    start-job {
                    
                    Invoke-Expression "& `"C:\Program Files\Zabbix Agent\zabbix_sender.exe`" -z zbx.domain.ru -s $env:computername.domain.ru -k critical.update -o $out"
                               
                              }
                    Так работает
                    Code:
                    Invoke-Expression "& `"C:\Program Files\Zabbix Agent\zabbix_sender.exe`" -z zbx.domain.ru -s $env:computername.domain.ru -k critical.update -o $out"

                    Comment

                    • karik-himik
                      Senior Member
                      • Oct 2015
                      • 116

                      #11
                      Вы написали : "... Но через zabbix_get никак
                      И чуть позже: "... Так работает"

                      либо Вы плохо объясняете, либо я плохо понимаю.
                      Работает или нет ?

                      И кстати, не нашел абсолютно никаких отличий в тех двух выдержках из скрипта.

                      Я, опять же повторюсь:
                      Zabbix_get нужен для проверки Типов Zabbix Агент и Zabbix Агент активный.

                      В скрипте вы передаёте данные через zabbix_sender в Ключ critical.update и наверняка у него тип Траппер. Правильно ?

                      А вызывая скрипт из zabbix_get Вы пытаетесь получить данные по ключу critical.update с Типом Zabbix Агент (ну или активный агент). Но такого ключа у Вас наверняка не сущевствует.
                      Понимаете о чем я ?

                      Comment

                      • xeonkeeper
                        Junior Member
                        • Sep 2012
                        • 27

                        #12
                        Originally posted by karik-himik
                        Вы написали : "... Но через zabbix_get никак
                        И чуть позже: "... Так работает"

                        либо Вы плохо объясняете, либо я плохо понимаю.
                        Работает или нет ?

                        И кстати, не нашел абсолютно никаких отличий в тех двух выдержках из скрипта.

                        Я, опять же повторюсь:
                        Zabbix_get нужен для проверки Типов Zabbix Агент и Zabbix Агент активный.

                        В скрипте вы передаёте данные через zabbix_sender в Ключ critical.update и наверняка у него тип Траппер. Правильно ?

                        А вызывая скрипт из zabbix_get Вы пытаетесь получить данные по ключу critical.update с Типом Zabbix Агент (ну или активный агент). Но такого ключа у Вас наверняка не сущевствует.
                        Понимаете о чем я ?
                        выдержки отличаются тем, как исполняется скрипт. В одном случае это просто выполнение, а в другом через start-job в бэкграунде.

                        Все верно, скрипт в конечно итоге должен отослать информацию через zabbix_sender и на zabbix сервере есть ключ принимающий эти данные.

                        zabbix_get мне нужен только для запуска этого скрипта, не для получения каких-либо данных. Т.е. на zabbix сервере есть item просто вызывающий этот скрипт на стороне клиента.

                        Comment

                        • sadman
                          Senior Member
                          • Dec 2010
                          • 1611

                          #13
                          Ну, а если через system.run[command,nowait] форкнуть скрипт? Пойдет такой способ?

                          Comment

                          • xeonkeeper
                            Junior Member
                            • Sep 2012
                            • 27

                            #14
                            Originally posted by sadman
                            Ну, а если через system.run[command,nowait] форкнуть скрипт? Пойдет такой способ?
                            Похоже это то, что нужно.
                            но не могу разобраться с синтаксисом. Пробую так
                            Code:
                            zabbix_get -s server -k system.run[powershell.exe -NoLogo -NonInteractive -File "C:\Program Files\Zabbix Agent\scripts\getcriticalupdates.ps1",nowait]
                            И так
                            Code:
                            zabbix_get -s server -k system.run[powershell.exe -command "C:\Program Files\Zabbix Agent\scripts\getcriticalupdates.ps1",nowait]
                            но получаю ошибку в синтаксисе
                            zabbix_get [24918]: illegal zbx_option --

                            Comment

                            • sadman
                              Senior Member
                              • Dec 2010
                              • 1611

                              #15
                              Ключ в одинарных кавычках позволяет, по-моему, использовать всё.

                              Code:
                              zabbix_get -s server -k 'system.run[powershell.exe -NoLogo -NonInteractive -File "C:\Program Files\Zabbix Agent\scripts\getcriticalupdates.ps1",nowait]'
                              В крайнем случае - system.run["powershell.exe -NoLogo -NonInteractive -File C:\zabbix_scripts\getcriticalupdates.ps1",nowait].
                              Last edited by sadman; 11-11-2016, 14:08.

                              Comment

                              Working...