BAT файл запускается локально из cmd, но зацикливается при запуске с использованием Jenkins.

Вопрос или проблема

Я создал следующий файл .bat, чтобы отключить службу onedrive:

whoami
"C:\Program Files\Microsoft OneDrive\OneDrive.exe" /shutdown

Если я дважды щелкаю на иконке файла .bat, это работает. Это также работает, когда я запускаю командную оболочку и ввожу "C:\Users\john\Desktop\onedrive-shutdown.bat".

Теперь я запускаю службу Jenkins на том же сервере Windows, на котором подключен как john (свойства входа в систему), и я создал проект, который состоит из следующего шага сборки:

введите описание изображения здесь

К сожалению, процесс /shutdown зависает/зацикливается, так как я получаю следующий вывод:

whoami
john
"C:\Program Files\Microsoft OneDrive\OneDrive.exe" /shutdown

(и иконка .... Кроме того, OneDrive не будет отключен).

Что я упускаю?

Обратите внимание, что:

  • Свойства входа в систему службы Jenkins установлены как: john
  • Я попробовал psexec64 -i 1 -u john -p PASSWORD "C:\Program Files\Microsoft OneDrive\OneDrive.exe" /shutdown, но это не сработало (те же результаты).
  • Я не могу использовать runas, так как у пользователя john есть пароль.
  • Любой другой файл .bat, например echo Hello World, работает нормально.

Это может быть связано с тем, что Jenkins запускается как служба Windows в Session 0, в то время как OneDrive работает в интерактивной пользовательской сессии (Session 1, 2 и т.д.). Команда /shutdown работает, когда выполняется вручную, потому что я запускаю ее в правильной сессии, но когда Jenkins выполняет ее, OneDrive не отвечает должным образом, потому что находится в другой сессии.

Проблема возникает потому, что Jenkins работает как системный процесс (0), тогда как OneDrive требует интерактивной пользовательской сессии (1) для корректной работы. Чтобы решить эту проблему, я создал две задачи планировщика для выполнения файлов батчей в правильном контексте пользователя.

Вот как я это решил:

  1. Создал два файла батчей, чтобы они выполняли следующие команды: "C:\Program Files\Microsoft OneDrive\OneDrive.exe" /shutdown и "C:\Program Files\Microsoft OneDrive\OneDrive.exe" /background.
  2. Создал задачу для команды /shutdown: schtasks /create /tn "OneDriveShutdownTask" /tr "C:\Users\john\Desktop\onedrive-shutdown.bat" /sc onstart /ru john /rl HIGHEST
  3. Создал задачу для команды /background: schtasks /create /tn "OneDriveBackgroundTask" /tr "C:\Users\john\Desktop\onedrive-background.bat" /sc onstart /ru john /rl LIMITED (обратите внимание на LIMITED здесь, так как OneDrive не может быть запущен в режиме HIGHEST).
  4. Запускайте schtasks /run /tn "OnedriveShutdownTask" или schtasks /run /tn "OnedriveBackgroundTask" либо используя Windows CMD, либо используя Jenkins.

Ответ или решение

Проблема, связанная с запуском .bat файла для выключения службы OneDrive через Jenkins, но успешном выполнении его локально с помощью командной строки, заслуживает тщательного анализа и подхода. Чтобы дать полное и профессиональное объяснение, необходимо рассмотреть теоретическую часть, сущность примера и практическое применение, избегая при этом общих фраз и клише.

Теоретическая часть

Основная причина проблемы заключается в различии сессий, в которых выполняются процессы. Jenkins, будучи Windows-сервисом, обычно запускается в системной сессии (сессия 0), которая предназначена для выполнения фоновых задач, не требующих взаимодействия с пользователем. OneDrive, в свою очередь, запускается в интерктивной пользовательской сессии (как правило, сессия 1 или выше), поскольку требует возможности взаимодействия с пользовательским интерфейсом.

Когда команда OneDrive.exe /shutdown выполняется в интерактивной пользовательской сессии, она может правильно взаимодействовать со всеми необходимыми компонентами, в частности с пользовательским интерфейсом, и завершить выполнение. Однако, когда эта же команда запускается из системной сессии Jenkins, ей не удается взаимодействовать с необходимыми компонентами, что приводит к зависанию или бесконечному выполнению команды.

Пример

Чтобы лучше понять, почему возникают такие проблемы, представим следующую ситуацию. Однажды поздно вечером системный администратор Джон пытается автоматизировать отключение OneDrive через Jenkins по завершении ежедневных задач. Он создает .bat файл с командами выключения OneDrive и находит, что при двойном клике по файлу или запуске через CMD файл работает безупречно. Однако, при добавлении данного скрипта в Jenkins, процесс зависает.

Джон догадывается, что проблема заключается в сессиях, поскольку и CMD, и двойной клик запускаются в интерактивной пользовательской сессии, в то время как Jenkins работает в сессии 0. Джон обращается к помощи Scheduled Tasks, чтобы перевести выполнение команды в контекст, соответствующий пользователю.

Практическое применение

Решение проблемы в данном контексте предполагает использование Планировщика задач Windows для выполнения команд в нужной пользовательской сессии. Это можно сделать следующим образом:

  1. Создание двух .bat файлов: один для команды OneDrive.exe /shutdown, второй для запуска OneDrive в фоновом режиме с командой /background.

  2. Создание задач в Планировщике задач с разными уровнями разрешения. Для завершения OneDrive:

    schtasks /create /tn "OneDriveShutdownTask" /tr "C:\Users\john\Desktop\onedrive-shutdown.bat" /sc onstart /ru john /rl HIGHEST

    Для запуска в фоне:

    schtasks /create /tn "OneDriveBackgroundTask" /tr "C:\Users\john\Desktop\onedrive-background.bat" /sc onstart /ru john /rl LIMITED

    Важно, что для запуска OneDrive нельзя использовать HIGHEST, поскольку это может привести к проблемам с работоспособностью программы.

  3. Запуск соответствующих задач через CMD или Jenkins с помощью команды:

    schtasks /run /tn "OneDriveShutdownTask"

    или

    schtasks /run /tn "OneDriveBackgroundTask"

Таким образом, задачи, созданные в Планировщике задач, будут выполняться в правильном контексте пользователя, что позволит успешно отключать или запускать OneDrive даже при использовании Jenkins. Этот подход эффективно решает проблему различия сессий, предоставляя инструмент для автоматизации процессов, которые требуют взаимодействия с системой в интерактивной сессии пользователя.

В заключение, решение вопросов взаимодействия системы с различными сессиями – это важный навык в автоматизации процессов на Windows сервере. Использование Планировщика задач для управления выполнением скриптов в нужных сессиях позволяет добиться высокой надежности и предсказуемости работы автоматизированных решений.

Оцените материал
Добавить комментарий

Капча загружается...