Назад | Перейти на главную страницу

Нужен сценарий / пакет / программа, которая запускает команду, которая не будет убита, когда родитель будет убит

Сценарий

Я использую Zabbix для мониторинга своих серверов, и недавно я хотел добавить еще несколько показателей для серверов Windows. В целях безопасности я использовал Zabbix's Параметр пользователя функция, но она ограничивает выполнение внешних команд примерно до 3 секунд. После этого команду насильно убивают.

Я хочу запустить несколько длительных команд, поэтому я использовал трюк с форума Zabbix: запустите команду в фоновом режиме, запишите результаты в файл и используйте Zabbix для их сбора.

В * nix это довольно просто сделать благодаря оператору «&», но в оболочке Windows такой поддержки нет. Что еще хуже, когда Zabbix убивает насильно, убивает cmd.exe он использовался для оценки команд, все дочерние процессы умирают, включая незавершенные фоновые задачи.

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

Что я пробовал

Попробовав вышеуказанное в различных комбинациях, я заметил, что если я звоню hstart из invis.vbs, команда, запущенная первым, останется в покое как процесс без родителей, когда invis.vbs убит.

Однако, поскольку мне нужно перенаправить вывод, команда, которую я хочу запустить, всегда имеет форму cmd.exe /c ""command" "args"" >log. Vbs также удаляет все кавычки, поэтому мне нужно кодировать команду с помощью самоопределяемых escape-последовательностей. Конечный результат включает около пяти уровней экранирования / цитирования, которые практически невозможно поддерживать.

Кто-нибудь знает лучшие решения?

Некоторые требования

Ты пробовала BeyondExec? Он очень похож на psexec, поэтому я не знаю, применима ли та же проблема, что и у вас, с psexec, но попробовать стоит.

  1. Разделите все, что должен делать ваш длинный сценарий, в отдельный сценарий.

  2. С помощью НССМпревратить этот сценарий в службу; установите для действия выхода значение «Игнорировать».

  3. Создайте короткий командный файл для запуска Zabbix, его содержимое - это всего лишь одна короткая строка для запуска службы, созданной вами на предыдущем шаге.

На шаге 2, в качестве альтернативы, завершите сценарий кодом выхода 0 и установите для действия AppExit \ 0 значение Exit, что позволит диспетчеру служб Windows пометить службу как остановленную.

я использую

запустить "mybatch.bat"

из другого командного файла (например, host.bat), и он отлично работает. Файл host.bat можно остановить, а другой файл работает нормально.

Предложение 1:

Используйте PSEXEC, но попробуйте избежать символа перенаправления. Я не знаком с Zabbix, поэтому не уверен, что это поможет.

psexec.exe ...args... 2^>nul

Предложение 2:

Используйте командный файл, содержащий команды schtasks.

--- schedzabbixscript.cmd ---

@echo off
schtasks /create /ru "NT AUTHORITY\SYSTEM" /sc once /tn zabbixtemp /tr c:\path\zabbixscript.cmd /st 23:23:59 /sd 12/31/2999
schtasks /run /tn zabbixtemp

--- zabbixscript.cmd ---

@echo off
...command...
...command...
...command...
schtasks /delete zabbixtemp /f

Если это работает для вас на одном сервере, чтобы сделать это на нескольких серверах без необходимости входа на каждый из них, вы можете изменить учетную запись, которая используется для запланированной задачи, на сетевую учетную запись и сохранить свой zabbixscript.cmd в центральное расположение и просто редактируйте его, когда вам нужно что-то изменить.

Считали ли вы, что вам не нужен Zabbix для реального мониторинга систем? Вместо этого вы можете заставить его отслеживать файл, в который записывается служба в системе. IOW, напишите службу, которая делает все, что вам нужно, и записывает конечные результаты в файл (XML, JSON, CSV, формат не имеет значения, если вы можете прочитать его позже из Zabbix). Тогда вашему приложению для мониторинга просто нужно будет проанализировать этот файл, что должно произойти почти мгновенно.

Если бы я следил за серверами, я бы, вероятно, запустил свои собственные пакетные или bash-сценарии, чтобы проверить состояние сервера и запланировать эти контрольные задания с помощью сервера Jenkins.

Windows Script Host - правильное решение. Если он только запускает пакетное задание, у него никогда не будет время быть убитым. Все, что тебе нужно:

Set quickShell = WScript.CreateObject("WScript.Shell")
myCommand = "mybatchfile.bat ""first argument"" ""second argument"" > logfile.log"
quickShell.Run myCommand, 0

Сохраните это как wrapper.vbs и запустите. Он запустит пакет и немедленно выйдет, оставив пакетный файл работающим в фоновом режиме.