Python перезапускает службу Windows

Обновлено: 05.07.2024

Командлет Restart-Service отправляет стоп-сообщение, а затем стартовое сообщение контроллеру служб Windows для указанной службы. Если служба уже была остановлена, она запускается без уведомления об ошибке. Вы можете указать службы по их именам служб или отображаемым именам или использовать параметр InputObject для передачи объекта, представляющего каждую службу, которую вы хотите перезапустить.

Примеры

Пример 1. Перезапустите службу на локальном компьютере

Эта команда перезапускает службу инструментария управления Windows (WinMgmt) на локальном компьютере.

Пример 2. Исключение службы

Эта команда перезапускает службы, отображаемое имя которых начинается с Net, за исключением службы Net Logon.

Пример 3. Запуск всех остановленных сетевых служб

Эта команда запускает все остановленные сетевые службы на компьютере.

Эта команда использует командлет Get-Service для получения объектов, представляющих службы, имя которых начинается с net. Оператор конвейера ( | ) отправляет объект службы командлету Where-Object, который выбирает только те службы, которые находятся в состоянии остановки. Другой оператор конвейера отправляет выбранные службы в Restart-Service .

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

Параметры

Запрашивает подтверждение перед запуском командлета.

< /tr>

Указывает отображаемые имена перезапускаемых служб. Подстановочные знаки разрешены.

Тип:SwitchParameter
Псевдонимы:cf
Позиция:Имя
Значение по умолчанию:False
Принимать ввод конвейера:False
Допускать подстановочные знаки:False
Тип:Строка [ ]
Позиция:Название
Значение по умолчанию:Нет
Принять ввод конвейера:False< /td>
Допускать подстановочные знаки:True

Указывает службы, которые этот командлет пропускает. Значение этого параметра определяет параметр Name. Введите элемент имени или шаблон, например s*. Подстановочные знаки разрешены.

Тип:Строка [ ]
Позиция:Название
Значение по умолчанию:Нет
Принять ввод конвейера:False< /td>
Допускать подстановочные знаки:True

Принудительно запускает команду без запроса подтверждения пользователя.

Тип:SwitchParameter
Позиция:Именованный
Значение по умолчанию:Нет
Принять ввод конвейера:False
Допускать подстановочные знаки:False

Указывает службы, которые перезапускает этот командлет. Значение этого параметра определяет параметр Name. Введите элемент имени или шаблон, например s*. Подстановочные знаки разрешены.

Тип:Строка [ ]
Позиция:Название
Значение по умолчанию:Нет
Принять ввод конвейера:False< /td>
Допускать подстановочные знаки:True

Указывает объекты ServiceController, представляющие перезапускаемые службы. Введите переменную, содержащую объекты, или введите команду или выражение для получения объектов.

Тип:ServiceController [ ]
Позиция:0
Значение по умолчанию:Нет
Принять ввод конвейера:True< /td>
Допускать подстановочные знаки:False

Указывает имена служб для перезапуска.

Тип:String [ ]
Псевдонимы:ServiceName
Позиция:0
Значение по умолчанию:Нет
Принимать ввод конвейера:True
Допускать подстановочные знаки:True< /td>

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

Тип:SwitchParameter
Позиция:Именованный
Значение по умолчанию:Нет
Принять ввод конвейера:False
Допускать подстановочные знаки:False

Показывает, что произойдет, если командлет запустится. Командлет не запущен.

< /tr>

Входные данные

System.ServiceProcess.ServiceController, System.String

Вы можете передать объект службы или строку, содержащую имя службы, этому командлету.

Недавно у меня возникла небольшая проблема со службой Windows.

Apache Tomcat примерно раз в две недели или около того просто зависает на одном из наших серверов. Когда я говорю хрипы, я имею в виду хрипы: попадание в :8080 дает быстрое сообщение нет прослушивания сервера.

Журналы Tomcat наводят меня на мысль, что это проблема с памятью Java, но, поскольку эта служба скоро переместится на новый виртуальный сервер, я не хочу пока слишком углубляться в нее, на случай, если она просто исчезнет после перемещения ( ленивый > умный). Однако это не означает, что я хочу тратить много времени на периодические проверки.

Существует множество отличных инструментов корпоративного мониторинга для такого рода вещей, таких как Nagios и Zenoss, которые по большей части бесплатны и имеют открытый исходный код. Однако в данном случае это было бы похоже на охоту на белок с базукой, и оба вышеупомянутых продукта не очень понравились бы нашему линуксофобному ИТ-отделу. Но немного Python может легко справиться с задачей.

Сначала вам нужно установить расширение Python для Windows, которое добавляет множество удобных функций, в том числе то, что мы ищем — win32serviceutil. Теперь мы создадим простую функцию для остановки, запуска, перезапуска или запроса состояния службы Windows.

Теперь мы побежали. Поскольку проблема здесь в том, что Tomcat просто запускается и умирает, простой urlopen для Apache сделает это.

Этот небольшой фрагмент кода устанавливает время ожидания подключения по умолчанию на 30 секунд, поэтому, если служба запущена и работает, она будет тратить до 30 секунд на загрузку URL-адреса в f. Если это работает без ошибок, мы золотые. Если возникает ошибка сокета (т. е. Tomcat не разговаривает), выполняется блок exept, перезапуская службу Tomcat. Настройте крошечный скрипт на запуск каждые 10 минут или около того, Боб — ваш дядя, самовосстанавливающийся сервер.

С помощью этого простого кода можно проделать немало трюков с управлением услугами. Скажем, у вас есть сервер ArcIMS, который тормозит (не редкость). Было бы неплохо, если бы службы просто перезапустили себя?

Допустим, у вас есть картографический сервис с именем map_service на сервере с именем servername (мы также подразумеваем, что вы здесь совершенно не креативны). ArcIMS создает изображения, которые выглядят так:
map_service_SERVERNAME24642500375.xxx

Если ArcIMS совершил прогулку, переход на веб-страницу с картой не будет иметь ссылки на изображение вашей карты. Итак, мы переходим на страницу, ищем текстовую строку «map_service_SERVERNAME», и если она ее не находит, мы перезапускаем службы:

Виола. Если ArcIMS не работает, наш скрипт вернет его к жизни, пока мы крутимся на стульях. Максимальное время простоя будет равно service_death + time_to_next_script_run + arcims_comes_back_to_life_time, последнее из которых может занять некоторое время. Но процесс «клиент звонит в службу поддержки» звонит вам, войдите в систему вручную и перезапустите процесс, который занимает еще больше времени, и невозможно сказать, сколько времени он не работает, прежде чем он попадет на ваш стол.

Конечно, вы можете сделать гораздо больше с помощью этих вещей — отправить себе электронное письмо или SMS-сообщение, записать что-то в файл или журнал событий и т. д. — но это должно дать вам некоторые идеи. Python — отличный язык для множества различных задач по управлению сервером.

Тобин Брэдли

Дизайнер, разработчик и писатель. Путешествует по миру с мешком воздушных змеев.

Службы Windows — это процессы, которые выполняются на рабочем столе Windows или на сервере Windows. Их можно удаленно запускать, останавливать, перезапускать и запрашивать статус. Для управления службами Windows существует модуль win32serviceutil, который можно найти в пакете win32all Марка Хаммонда.

Информацию о том, как получить пакет win32all, см. в Приложении B.

В следующем примере показано, как запустить службу, остановить службу, перезапустить службу или получить статус службы с помощью Python:

импортировать win32serviceutil, время

def service_info(действие, машина, служба):

если действие == 'стоп':

напечатать %s успешно остановлено % службы

elif action == 'start':

напечатать %s успешно запущена служба %

elif action == 'перезапустить':

print '%s успешно перезапущен' % службы

elif action == 'статус':

if win32serviceutil.QueryServiceStatus(служба, машина)[1] =

print "%s работает нормально" % служба

print "%s *не* работает" % служба

service_info('запуск', машина, служба)

service_info('stop', машина, служба)

service_info('запуск', машина, служба)

service_info('перезагрузка', машина, служба)

service_info('статус', машина, служба)

Поскольку этот пример немного длиннее остальных, давайте рассмотрим его раздел за разделом.

Функция service_info принимает в качестве параметров действие, машину и имя службы:

def service_info(действие, машина, служба):

Остальная часть функции представляет собой просто структуру if, которая выполняет действия над службой на основе переданного параметра действия:

win32serviceutil.StopService(service, machine) print '%s успешно остановлен' % service time.sleep(3) elif action == 'start':

win32serviceutil.StartService(service, machine) print '%s успешно запущен' % service time.sleep(3) elif action == 'restart':

win32serviceutil.RestartService(service, machine) print '%s успешно перезапущен' % service time.sleep(3) elif action == 'status':

if win32serviceutil.QueryServiceStatus(service, machine)[1] == 4:

print "%s работает нормально" % служба else:

print "%s *не* работает" % служба

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


Вы когда-нибудь сталкивались с необходимостью написать сценарий Python, который мог бы работать в фоновом режиме как служба Windows? В этом посте вы узнаете, как это сделать менее чем за 10 минут, без шуток.

Я пропущу все введение о службах Windows, насколько они могут быть удобны, насколько ценен тот факт, что они могут работать в фоновом режиме, даже если пользователь вышел из системы и т. д.… Я имею в виду, что если вы умеете программировать на Python и используете Windows, держу пари, вы уже знаете, что такое служба Windows, не так ли?

Итак, прежде всего, давайте начнем с установки расширений Python для Windows:

После того, как вы это сделаете, давайте напишем этот базовый класс, ваша служба Windows станет подклассом этого базового класса.

Давайте немного рассмотрим класс, который мы только что представили.

def SvcDoRun(self): это метод, который будет вызываться при запросе запуска службы.

def SvcStop(self): это метод, который будет вызываться при запросе остановки службы.

def start(self): это метод, который вам будет предложено переопределить, если вам нужно что-то сделать при запуске службы (до ее запуска)

def stop(self): это метод, который вам будет предложено переопределить, если вам нужно что-то сделать, когда служба останавливается (до остановки)

def main(self): это метод, который будет содержать логику вашего скрипта, обычно в цикле, который поддерживает его до тех пор, пока служба не будет остановлена.

def parse_command_line(cls): это метод, который обрабатывает интерфейс командной строки, который можно использовать для установки и обновления службы Windows

Вы видите, как легко с помощью pywin32 взаимодействовать с системой для создания службы Windows? Последнее упоминание относится к следующим переменным:

Это всего лишь три переменные, которые содержат имя службы, «понятное имя», которое будет использоваться Windows для отображения имени в консоли mmc, и краткое описание вашей службы.

Как всегда, хватит разговоров, давайте напишем что-нибудь полезное!

Предположим, что мы хотим создать Winservice, который при запуске создает случайный файл на нашем диске C: каждые 5 секунд.

Что? Как вы думаете, это глупо? Что ж, установите его на свой босс-компьютер, установите папку назначения в качестве рабочего стола пользователя, и вы передумаете. :)

Однако как добиться такого результата? Очень просто.

  • Подкласс класса SMWinservice, с которым мы только что познакомились.
  • В новом классе переопределите три переменные: svc_name, svc_display_name и svc_description.
  • Переопределите метод start, чтобы установить условие выполнения. Для этого достаточно задать логическую переменную.
  • Переопределите метод stop, чтобы сделать недействительным условие выполнения, когда служба запрошена на остановку.
  • Переопределите метод main, чтобы добавить логику создания случайного файла каждые 5 секунд.
  • Добавьте вызов функции parse_command_line для обработки интерфейса командной строки.

Результат должен быть примерно таким:

Вот оно! Теперь пришло время установить наш недавно созданный винсервис. Просто откройте командную строку, перейдите в папку со скриптом и установите службу с помощью команды:

В будущем, если вы захотите изменить код своего сервиса, просто измените его и переустановите сервис с помощью

Теперь откройте оснастку MSC «Службы»

найдите новый винсервис PythonCornerExample, щелкните правой кнопкой мыши и выберите свойства.Здесь вы можете запустить свой сервис и настроить его по своему усмотрению.

Теперь попробуйте запустить службу и перейдите к содержимому папки C:.

Вы видите, что все эти файлы создаются в вашей папке C:? Да, это работает!

Но пора остановиться! :) Вы можете сделать это из предыдущих окон или просто с помощью командной строки

Если что-то пойдет не так…

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

  • Проверьте, присутствует ли Python в вашей переменной PATH. Это ДОЛЖНО быть там. Чтобы проверить это, просто откройте командную строку и попробуйте запустить интерпретатор Python, набрав «python». Если он запускается, все в порядке.
  • Убедитесь, что у вас есть файл C:\Program Files\Python36\Lib\site-packages\win32\pywintypes36.dll (обратите внимание, что «36» — это версия вашей установки Python). Если у вас нет этого файла, возьмите его из C:\Program Files\Python36\Lib\site-packages\pywin32_system32\pywintypes36.dll и скопируйте в C:\Program Files\Python36\Lib\site-packages\win32.

Если у вас все еще есть проблемы, попробуйте выполнить скрипт Python в режиме отладки. Чтобы попробовать это с нашим предыдущим примером, откройте терминал, перейдите в каталог, где находится скрипт, и введите

Хорошо, это все на сегодня, это было просто краткое введение в разработку служб Windows с помощью Python. Попробуйте сами и … удачного кодирования!

Запускайте скрипт Python при загрузке компьютера; Запускайте его периодически в течение дня

Python – популярный язык программирования.


В версии 13 AlwaysUp (выпущенной в октябре 2021 г.) появился очень простой способ заставить Python запускаться при загрузке и работать круглосуточно и без выходных.

Новый советник по приложениям поможет вам установить Python как службу Windows со всеми рекомендуемыми нами настройками всего за несколько кликов. Просто выберите Advisor в меню приложения и следуйте простым инструкциям.

Чтобы настроить скрипт Python для работы в качестве службы Windows с помощью AlwaysUp:

При необходимости загрузите и установите AlwaysUp.

Загрузите и установите версию Python для Windows и любые необходимые расширения, если это необходимо. Мы рекомендуем Python версии 3.X (последняя доступная на момент написания этого руководства), но все должно работать так же хорошо с версией 2.X или коммерческим дистрибутивом ActivePython.

Мы установили Python версии 3.2 в C:\Python32.

Выберите Приложение > Добавить, чтобы открыть окно добавления приложения:

На вкладке "Общие":

В поле Приложение введите полный путь к исполняемому файлу Python (python.exe). Это C:\Python32\python.exe для нашей установки.

В поле «Аргументы» введите полный путь к вашему скрипту Python. Мы хотим запустить наш образец скрипта C:\Python32\copy-files.py. Обязательно заключайте путь в двойные кавычки (""), если он содержит пробел!

В поле Имя введите имя, которым вы будете называть это приложение в AlwaysUp. Мы использовали My Python Script, но вы можете указать практически все, что захотите.

Служба Python Script Windows: вкладка

Если вы хотите, чтобы ваш скрипт запускался только периодически (т. е. не круглосуточно и без выходных), перейдите на вкладку «Перезапуск» и выберите время запуска. Мы хотим, чтобы наш скрипт запускался каждый день в 3 часа ночи.

Служба Python Script Windows: вкладка

Нажмите кнопку Сохранить. Через пару секунд в окне AlwaysUp появится приложение My Python Script. Однако он еще не запущен.

Скрипт Python Служба Windows: создана

Чтобы запустить службу, которая запустит скрипт Python в 3 часа ночи, выберите «Приложение» > «Запустить «Мой скрипт Python».

Python Script Служба Windows: работает

Вот оно! В следующий раз, когда ваш компьютер загрузится, ваша служба Python будет запущена немедленно, прежде чем кто-либо войдет в систему. Конечно, по замыслу ваш скрипт не запустится до 3 часов ночи, но это легко изменить на вкладке «Перезагрузка» (шаг 6). Мы рекомендуем вам изучить множество других параметров, которые могут подойти для вашей среды.

Читайте также:

Тип:SwitchParameter
Псевдонимы:wi
Позиция:Имя
Значение по умолчанию:False
Принимать ввод конвейера:False
Допускать подстановочные знаки:False