Как получить список служб

Во время работы операционной системы Windows запускается и работает много служб. Просмотреть весь список служб можно нажав “Пуск”- “Панель управления”- “Администрирование” “Службы”.

Далее в таблице приводитя названия служб и системных процессов участвующих в них. Для остановки, приостановки, запуска и возобновления служб неоходимо воспользоваться параметрами утилиты командной строки NET – например NET START spooler.

Имя службыСокращенное название службыНазвание процесса

В операционной системе Linux, так же как и в Windows, кроме обычных программ, с которыми может взаимодействовать пользователь есть еще один вид программ. Это работающие в фоне службы. Важность служб тяжело переоценить, они следят за состоянием системы, обеспечивают автоматическое подключение внешних устройств и сети, позволяют процессам взаимодействовать с оборудованием (dbus), а также в виде служб реализованы различные веб-серверы и серверы баз данных.

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

Как в командном файле получить список служб Windows? Как узнать, установлена ли определённая служба? Как проверить её состояние? Как её перезапустить?
Получить ответы на эти важные вопросы помогут команды SC и NET.

Для получения списка служб используется команда:

sc query type= service

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

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

Важно! В качестве строки поиска здесь используется внутреннее имя службы, которое не зависит от языковых настроек (DISPLAY_NAME зависит).

Для проверки конфигурации и статуса можно использовать команду SC QUERY , команда работает с внутренними именами, поэтому для проверки службы Планировщик задач можно написать SC QUERY schedule, и это будет работать везде. Проверить, запущена ли служба, можно по наличию строки RUNNING или STOPPED:

The emphasis of this question is on the second half.

I don’t have the option of using PowerShell (unfortunately) so I’m looking for a native CMD way. I assumed there would be a way to use the sc query command but all that lists is:

FYI – The OS is WIndows 2003 SP2 and I need this information for all of the services so is a long winded process if I have to do it manually for each of them.

asked Apr 17, 2015 at 14:56

wmic:
Name and account for all services:
wmic service get name,startname

started services only:
wmic service where started=true get name, startname

services with specific pattern in name:
wmic service where ‘name like “%sql%”‘ get name, startname

Full syntax here: https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx

answered Apr 17, 2015 at 15:54

1 gold badge21 silver badges32 bronze badges

You can accomplish this in two steps:

I would recommend a batch script like this:

That gives you an output like this:


Как получить список служб

Of course, you can further cleanup that output or write to a CSV file in any manner that you would like.

answered Apr 17, 2015 at 15:21

2 silver badges8 bronze badges

sc sdshow is what will get you security descriptors, but this will complicate things if you don’t know how to read SDDL strings.

7 silver badges16 bronze badges

Although you can’t use PowerShell you should still be able to use VBScript to pull the info from WMI:

Here’s a VBS script that will list all services and the account they start as:

Save it and then run it with cscript ScriptName.vbs.

objService. State would give you the service’s current state (since you mentioned you’re looking to filter by it).

More info on the Win32_Service class.

answered Apr 17, 2015 at 15:40

19 gold badges201 silver badges268 bronze badges

Но, есть множество талантливой молодежи, или просто проницательных людей, которые с огромным удовольствие захотят засунуть свой нос в вашу систему. Конечно, большинство простых обывателей не будет извращаться над собой используя Windows NT или Windows 2000, да и Семерка все чаще наступает на горло «простенькому» ХР, но, командная_строка в мире операционных систем, это все ровно, что таблица умножения в мире финансов.

В Панели управление/Администрирование находится оснастка Службы, которая позволяет управлять рядом сервисов. Двойной щелчок по любой из них позволяет просмотреть ряд параметров:

Вкладка Общие показывает состояние, тип запуска, описание, исполняемый файл и другую информацию. Использование CMD позволяет получить аналогичную информацию, а также управлять состоянием и запуском служб, используя командную строку:

Sc start Имя_Службы – производится запуск службы из командной строки

Sc pause Имя_Службы – приостановка сервиса

Sc continue Имя_Службы – восстановление работы приостановленного сервиса

Sc stop Имя_Службы – полная остановка

Эти команды можно применять и на удаленных машинах. Например, что бы запустить УдаленныйРеестр на машине с адресом 192.168.1.6., надо прописать (вместо IP можно и имя машины прописать, например Mailer):

192.168.1.6 start RemoteRegistry

Хотя, запустить службу из командной строки можно и при использовании утилиту net start, или net stop соответственно (net stop RemoteRegistry)

Что бы настроить тип запуска применяется команда sc config (хотя ее возможности этим не ограничиваются). Синтаксис следующий:

config ИмяСлужбы start флаг

Флаг может принимать три значения:

192.168.1.6 config RemoteRegistry start disable

тут мы отключили RemoteRegistry на удаленной машине. Стоит помнить, что отключение сервиса его не останавливает, после перезагрузки он может вновь запустится.

На вкладке Вход в систему видно, что сервис можно запускать или от имени системной учетной записи, или от имени любой другой учетной записи. Так, что бы запустить службу из командной строки под тои или иной учетной записью, используется синтаксис:

config ИмяCлужбы obj ИмяУчетнойЗаписи

В данном примере УдаленныйРеестр грузится под ЛокальнойСлужбой (NT AUTHORITYLocalService), а можно и под системной учетной записью (LocalSystem), но лучше этого не делать:

config RemoteRegistry obj LocalSystem

Если использовать флаг type= interact, то это укажет, что сервис может взаимодействовать с рабочим столом Windows:

config RemoteRegistry obj LocalSystem interact own

Используя команду sc qc ИмяСлужбы можно детально просмотреть информацию о ней, в том числе и тип запуска, например:

Может возникнуть необходимость сделать запуск определенной службы, используя командную строку, не от имени системы, а от имени пользователя, в таком случае надо указывать имя учетной записи и пароль, например:

config ИмяСлужбы obj ДоменПользователь
password пароль own

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

Получение списка сервисов

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


Как получить список служб

Что бы найти конкретный сервис мы можем указать точное или приблизительное имя:

# Точный поиск
Get-Service -Name ‘WinRM’
# Поиск с использованием маски
Get-Service -Name ‘*Win*RM*’


Как получить список служб

Использование имение ‘*Win*RM*’ ищет соответствия, где в начале и конце могут быть еще символы, а так же посередине. То есть строка ‘Microsoft Windows RM v2’ тоже бы подошла, так как в ней встречается и ‘Win’ и ‘RM’.

Далее нам нужно выбрать способ для удаленного обращения к компьютерам. Мы можем использовать метод самого командлета Get-Service либо отдельную команду Invoke-Command. Обе команды, как минимум, будут нуждаться в запущенной службе WinRM, а пользователь должен обладать нужными правами (администратором).

В обеих командах мы можем перечислить несколько имен ПК сразу. В варианте с Get-Service имена компьютеров указываются после параметра -ComputerName. Отмечу, что использование IP адресов не самый лучший вариант для таких команд, так как будет использоваться NTLM, а не Kerberos (вариант с доменным именем):

Get-Service -ComputerName ‘localhost’,’127.0.0.1′ -Name ‘*Win*RM*’


Как получить список служб

Добавив для вывода свойство “MachineName” мы так же получим имена компьютеров:


Как получить список служб

Второй вариант использования – Invoke-Command. Плюс этой команды в том, что мы сразу можем использовать несколько команд на удаленном компьютере, а не по одной команде на каждом. Следующий пример аналогичен предыдущему:


Как получить список служб

Если вы планируете использовать другого пользователя, то его можно объявить с командой Get-Credential и поместить в переменную:

$cred = Get-Credential


Как получить список служб

Такая переменная будет работать только с Invoke-Command:

:/>  'wsl.exe --install'."

Поиск сервисов на компьютерах AD

Список компьютеров мы можем получить выполнив команду Get-ADComputer. Эта команда будет доступна на сервере с AD или ПК с RSAT. Следующая команда вернет все ПК в Active Directory:

Get-ADComputer -Filter *


Как получить список служб

Что бы получить компьютеры из одной OU (организационной единицы) мы должны использовать определенный формат. Например мои компьютеры находятся в домене ‘domain.local’, а организационная единица называется Moscow:

Get-ADComputer -Filter * -SearchBase ‘OU=Moscow,DC=domain,DC=local’


Как получить список служб

Что бы получить только имена компьютеров нужно обратиться к свойству Name:

(Get-ADComputer -Filter * -SearchBase ‘OU=Moscow,DC=domain,DC=local’). Name


Как получить список служб

Уточнить имя ПК можно добавив параметр Filter нужное свойство. Например мне нужны компьютеры с именами, где встречается цифра ‘5’:


Как получить список служб

Теперь можно искать сервис на этих компьютерах:


Как получить список служб

Параметр ‘-ErrorAction SilentlyContinue’ исключит ошибки связанные с выключенными компьютерами и не остановит выполнение скрипта. Это еще одно отличие от аналогичного способа с Get-Service, так как скрипт остановится при первой такой ошибке:


Как получить список служб

Выгрузить такие данные можно, например, в CSV:

Теги:

#powershell

#ad

I once saw a guy run a command and got a list of all installed applications on his computer. How do I do this?

I would like a list of my currently installed applications. I believe he used WSH somehow.

asked Nov 10, 2009 at 19:05

If you use Windows Vista or Windows 7 and you didn’t want install additional software, you can:

answered Nov 10, 2009 at 19:15

5 gold badges45 silver badges55 bronze badges

PsInfo from Microsoft/Sysinternals can list all the installed software if you use the -s flag when you run it. You can also use -c to output it as a csv file to use in Excel for example.

answered Nov 10, 2009 at 19:19

1 gold badge21 silver badges22 bronze badges

A PowerShell script to list them:

Not exactly command line, but for this purpose I personally use CCleaner’s uninstall tool, and you can export the list of installed software to a text file:


Как получить список служб

answered Nov 10, 2009 at 19:17

27 gold badges341 silver badges348 bronze badges


Как получить список служб

SIW is freeware and portable, and installation isn’t required.

answered Nov 10, 2009 at 20:06

To add to MicTech’s solution – use wmic and capture the list of installed software to a file:

Open a command-line window (Windows + R, CMD. EXE)

wmic /OUTPUT:my_software.txt product get name

answered Aug 29, 2015 at 19:19

The CCleaner solution above seems like a decent way to go about it, unless you’re determined to use the command-line. I’ve used CCleaner before, it’s a good tool But don’t assume that everything is registered in the Add/Remove Programs applet (the same list). There are plenty of apps that use xcopy-style installation, i.e. simply unzip this archive and run. Those will not show up in the list.

ответил 10 ноя 2009 в 19:43

1 золотой знак22 серебряных знака26 бронзовых знаков

Sysinternals psinfo.exe предоставляет наиболее полную информацию из всех приведенных предложений, и его можно запустить на любом ПК с Windows из командной строки непосредственно из приглашения CMD с повышенными правами, без постоянной загрузки:

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

Лицензионное соглашение может быть автоматически принято следующим образом:

ответил 29 мая 2015 в 15:38

Я использую powershell здесь:

ответил 17 сентября 2020 г. в 2:55

2 золотых знака19 серебряных знаков32 бронзовых знака

Существует портативное приложение Showmysoft. Он покажет установленное программное обеспечение на локальном компьютере и удаленных компьютерах и может экспортировать в PDF и CSV. Установка не требуется. Скачать с http://spidersoft.in/showmysoft/.

Минимальные системные требования: Microsoft . NET Framework 2.0.

ответил 2 сентября 2013 г. в 8:52

Закодированная версия в программах, установленных на C# через реестр Windows:

ответил 12 июля 2017 в 15:37

Существует ли команда, эквивалентная ‘ps’ в Unix, которая может перечислить все процессы на машине Windows?

спросил 10 сентября 2008 г. в 5:50

Работа с cmd.exe:

Если у вас есть Powershell:

(вы также можете запрашивать удаленные машины с помощью /node:ComputerOrIP, и есть НАМНОГО больше способов настроить эту команду: ссылка)

ответил 10 сентября 2008 г. в 5:52

7 золотых знаков47 серебряных знаков53 бронзовых знака

Я хотел упомянуть, что WMIC (запись Пэм) может сделать гораздо больше. Взгляните на мою страницу фрагментов WMIC, которая представляет собой шпаргалку, показывающую многие распространенные способы использования WMIC (с показанным примером вывода) здесь

ответил 15 сентября 2008 г. в 9:53

4 серебряных знака10 бронзовых знаков

WMIC /OUTPUT:C:ProcessList.txt путь win32_process get Caption,Processid,Commandline

ответил 15 февраля 2010 в 8:06

Пробовал в Windows 7. Команда: TASKLIST /FI “IMAGENAME eq application_name”

Чтобы показать весь процесс с информацией о порте:

ответил 8 ноября 2011 г. в 11:56

список задач или pslist от sysinternals. Кроме того, get-process отлично работает с PowerShell.

ответил 10 сентября 2008 в 5:57

1 золотой знак13 серебряных знаков23 бронзовых знака

Если вы используете Powershell, у него есть команда «ps» (она имеет псевдоним Get-Process)

ответил 10 сентября 2008 г. в 7:48

Чтобы убить процесс, используйте:

TASKKILL /F /IM имя_процесса.exe

TASKKILL /F /IM firefox.exe

15 золотых знаков57 серебряных знаков68 бронзовых знаков

ответил 8 мая 2013 в 11:58

Если вы используете Windows XP, попробуйте использовать команду ‘tasklist’. Я попробовал это с Vista, и, похоже, это тоже работает.

1 золотой знак2 серебряных знака5 бронзовых знаков

открыть командную строку Windows

ответил 1 июня 2018 в 4:58

Используйте эту команду, чтобы увидеть все процессы в Windows-машине

ответил 5 сентября 2014 г. в 7:30

1 серебряный знак6 бронзовых знаков

Вызывается из той же программы, запущенной как обычный процесс (не как служба), она запустилась.

Нет помощи, чтобы изменить это. Я не мог найти никакой причины или решения, но вместо этого использовал «pslist/accepteula» sysinternal.

Та же проблема с taskkill: пришлось заменить на pskill.

ответил 16 мая 2012 в 6:58

Я сделал msproject (исходный код), архив доступен по адресу:
Архив проекта lsproc.zip

и исполняемый файл:
Бинарный файл lsproc.exe

это инструмент командной строки
вывод:

ответил 25 марта 2011 в 18:47

С помощью WMI и Powershell вы можете:

Get-WMIObject -Class Win32_Process

Затем вы можете фильтровать свойства с помощью Select-Object и отображать в графическом интерфейсе с помощью Out-GridView.

ответил 16 сентября 2020 г. в 7:29

выполняется в cmd,дескриптор — это идентификатор процесса:

wmic.exe путь Win32_Process, где дескриптор=’22792′ get Commandline /format:list

ответил 17 июня 2021 г. в 2:38

Здравствуйте, если вы хотите получить список идентификаторов запущенных процессов на компьютере с Windows, откройте экран cmd и введите:

используйте клавишу Enter для прокрутки.

answered Aug 14, 2014 at 14:05

И поэтому, в этой статье мы попробуем получить список служб используя командную строку и сценарии Windows Script Host, кодить будем на языке vbscript и jscript.

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

Тут мы указали, что данные должны выводиться не на экран, а в текстовый файл service.txt в папку D:work. Лады, давайте взглянем, что нам наколдовала утилита sc query:


Как получить список служб

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

Последние четыре строки нам пока не представляют интерес.

Ладно, теперь давайте посмотрим, как можно задать параметры фильтрации:

— определяем тип, например,driver — драйвер, service – сервис (стоит по умолчанию), all – все. — определяет статус, например, active – активная (значение по умолчанию), inactive — неактивная, all – все. — размер буфера перечисления в байтах, по умолчанию 4096 – номер индекса, начиная с которого начинается или возобновляется перечисление, по умолчанию значение 0 — группа служб для перечисления, по умолчанию стоит all groups.

И так, что бы задать фильтр, мы прописываем команду sc query,пробел, далее пишем имя фильтра, знак равенства, пробел и значение.

Так, что бы получить список неактивных служб, командная строка требует следующий синтаксис:

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

:/>  Как увеличить звук на ноутбуке? 17 лайфхаков | Блог Comfy

Вот как выглядит будущая форма для сценария:


Как получить список служб

Сперва мы напишем пример на языке vbscript, я в нем все разъясню, что бы было понятно, что к чему, а потом на его основе мы напишем пример на языке jscript.

И так, приступаем!!!

‘ Список служб командная строка

 

 
WSO, WshShell, FSO
f, t, cur_dir, temp_file, edit1
type_f, state_f, bufsize_f, ri_f
Button_Analice, Button_Open, Button_Cleare
data_file
 
‘*************создаем ссылки на объекты*************
WSO = ()
WshShell = ()
FSO = ()

‘Задаем начальные размеры и отступы
f = WSO. CreateForm(0,0,0,0)
‘Задаем через свойства ширину и высоту
f. ClientWidth = 600
f. ClientHeight = 650

f. CenterControl()

f. Text = “Список служб командная строка”
‘нельзя менять размеры
f. SizeGrip =
‘нельзя развернуть форму
f. MaximizeBox =
 
‘ Текущий каталог
cur_dir = WshShell. CurrentDirectory
‘ путь к временному файлу
temp_file = WShShell. ExpandEnvironmentStrings() & & FSO. GetTempName
 
‘Поле для вывода данных
edit1 = f. CreateEdit(0,0,400,650,WSO. Translate())
edit1. ScrollBars = WSO. Translate()
edit1. ReadOnly =
edit1. WordWrap =
 
‘**************************** Тип ********************************************
f. TextOut 410,10,

type_f = f. CreateComboBox(480,10,100,20,WSO. Translate())
type_f.add()
type_f.add()
type_f.add()
type_f. ItemIndex=2

 
‘**************************** Статус ********************************************
f. TextOut 410,40,

state_f = f. CreateComboBox(480,40,100,20,WSO. Translate())
state_f.add()
state_f.add()
state_f.add()
state_f. ItemIndex=1

 
‘**************************** Буфер ********************************************
f. TextOut 410,70,
‘Поле для ввода
bufsize_f = f. CreateEdit(480,70,100,20,WSO. Translate())
‘Задаем тип вводимых данных
bufsize_f. DataType=WSO. Translate()
bufsize_f. Text=

 
‘**************************** Номер индекса ********************************************
f. TextOut 410,100,
‘Поле для ввода
ri_f = f. CreateEdit(480,100,100,20,WSO. Translate())
‘Задаем тип вводимых данных
ri_f. DataType=WSO. Translate()
ri_f. Text=

 

 
‘ кнопка получения данных
Button_Analice = f. CreateButton(480,130,100,25,)
Button_Analice. OnClick = getref()
 
‘ кнопка очистки данных
Button_Cleare = f. CreateButton(480,160,100,25,)
Button_Cleare. OnClick = getref()
 
‘кнопка открытия файла с данными
Button_Open = f. CreateButton(480,190,100,25,)
Button_Open. OnClick = getref()
 
t = f. CreateHyperLink(450,230,250,25,)
 
f. Show()
WSO. Run()
 
‘Очищаем поля вывода информации
Cleare()
edit1. Text=
data_file=

 

Analize()
type_date, state_date, bufsize_date, ri_date
get_file_data
Cleare()
type_date = ” type= ” & type_f. Text
state_date = ” state= ” & state_f. Text
bufsize_date = ” bufsize= ” & bufsize_f. Text
ri_date = ” ri= ” & ri_f. Text
type_f. Text = type_date =
state_f. Text = state_date =
 
‘запуск командной строки для получения списка служб с выводом данных в файл
WshShell. Run “cmd.exe /c sc query” & type_date & state_date & bufsize_date & ri_date & & temp_file,1,
 
‘***********открываем файл для считывания данных*********************
get_file_data=FSO. OpenTextFile(temp_file, 1, )
data_file = get_file_data. ReadAll
get_file_data.

 
edit1. Text = data_file

 
()
‘ открываем временный файл
WshShell. Run & temp_file

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

Переменные type_date, state_date, bufsize_date и ri_date хранять в себе значения, которые прописаны в полях и списках формы, тут мы сразу вставляем имя флага и знак равенства. Далее происходит проверка флагов type и state, дело в том, что если им присвоить значения по умолчанию, то возникнет ошибка в самой командной строке, поэтому, все значения по умолчанию мы заменяем на пустую строку. Далее, используя функцию Run объекта WScript. Shell мы запускаем командную строку с параметрами для получения списка служб, переменная temp_file хранит путь к временному файлу, именно в него будет направлен вывод. Далее происходит открытие временного файла, считывание из него данных, и их запись в поле вывода на форме. При нажатии на кнопку Открыть, происходит вызов функции Open, которая отвечает за открытие временного файла программой wordpad.exe.

А вот аналогичный пример, но уже на языке jscript:

// Список служб командная строка

 
WSO WshShell FSO
f t cur_dir temp_file edit1
type_f state_f bufsize_f ri_f
Button_Analice Button_Open Button_Cleare
data_file
 
//*************создаем ссылки на объекты***********************
WshShell WScript.
FSO WScript.
WSO WScript.

 
//Задаем начальные размеры и отступы
f WSO.
//Задаем через свойства ширину и высоту
f.
f.

f.

f. “Список служб командная строка”
//нельзя менять размеры
f.
//нельзя развернуть форму
f.
 
// Текущий каталог
cur_dir WshShell.
// путь к временному файлу
temp_file WshShell. FSO.
 
//Поле для вывода данных
edit1 f. WSO.
edit1. WSO.
edit1.
edit1.
 
//**************************** Тип ********************************************
f.

type_f f. WSO.
type_f.
type_f.
type_f.
type_f.

 
//**************************** Статус ********************************************
f.

state_f f. WSO.
state_f.
state_f.
state_f.
state_f.

 
//**************************** Буфер ********************************************
f.
//Поле для ввода
bufsize_f f. WSO.
//Задаем тип вводимых данных
bufsize_f. WSO.
bufsize_f.

 
//**************************** Номер индекса ********************************************
f.
//Поле для ввода
ri_f f. WSO.
//Задаем тип вводимых данных
ri_f. WSO.
ri_f.

 

 
// кнопка получения данных
Button_Analice f.
Button_Analice. Analize
 
// кнопка очистки данных
Button_Cleare f.
Button_Cleare. Cleare
 
//кнопка открытия файла с данными
Button_Open f.
Button_Open. Open
 
t f.
 
f.
WSO.
 
//Очищаем поля вывода информации
Cleare
edit1.
data_file

 

Analize
Cleare
type_date ” type= ” type_f.
state_date ” state= ” state_f.
bufsize_date ” bufsize= ” bufsize_f.
ri_date ” ri= ” ri_f.
 
type_date state_date bufsize_date ri_date get_file_data
 
type_f. type_date
state_f. state_date
 
//запуск командной строки для получения списка служб с выводом данных в файл
WshShell. “cmd.exe /c sc query” type_date state_date bufsize_date ri_date temp_file
 
//***********открываем файл для считывания данных*********************
get_file_dataFSO.temp_file
data_file get_file_data.
get_file_data.

 
edit1. data_file

 
Open
// открываем временный файл
WshShell. temp_file

Немного теории

Чтобы всем этим управлять нужна основная служба – система инициализации, которая будет запускать службы Linux в нужный момент, следить чтобы они нормально работали, записывать сообщения логов, и самое главное предоставлять пользователям интерфейс для управления службами. Саму систему инициализации запускает ядро Linux. Сама система инизациализации запускается ядром Linux.

Раньше, для управления службами использовались скрипты. Тогда каждая служба запускалась в фоновом режиме одна за другой, без возможности параллельного запуска. Скрипт инициализации получал PID процесса для каждой службы, сохранял его и потом с помощью него можно было проверить работает ли служба и остановить службу Linux если это нужно. Все это можно сделать и вручную.

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

Служба в Systemd описывается файлом юнита, в нем описано каким образом эту службу надо запускать, а также как с ней себя вести. Существуют такие типы юнитов:

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

Ещё у все службы Systemd можно поделить на две группы:

Кроме того, у Systemd есть задачи (Jobs), они выполняются и видны только когда какой нибудь службе применяется действие, например, запуск или остановка.

Основы рассмотрели, теперь будет настройка служб LInux. Давайте познакомимся с утилитой для управления службами.

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

Службы обеспечивают ключевые функции рабочих станций и серверов. Для управления системными службами на локальных и удаленных системах используется команда контроллера служб (service controller command) SC, имеющая набор подкоманд, здесь описывается лишь их некоторая часть.

Для удобства пользования в командной строке используются сокращенные названия служб Windows (например, Spooler – диспетчер очереди печати, Dhcp – DHCP-клиент, W32Time – Служба времени Windows и т.п., см таблицу по ссылке).

Команды SC – настройка, запуск и останов системный служб Windows

Пример команды sc на компьютере с Windows 10:

Утилита systemctl

В Systemd есть специальный инструмент для управления службами в Linux – команда systemctl. Эта утилита позволяет делать очень много вещей, начиная от перезапуска службы linux и проверки ее состояния, до анализа эффективности загрузки службы. Синтаксис у этой утилиты такой:

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

Опции очень сильно зависят от команд, поэтому рассмотрим их позже, а пока пройдемся по командам:

:/>  containers - Dockerfile unable to execute CMD command (docker for windows) - Stack Overflow

Команда systemctl поддерживает и другие команды, но в этой статье перечислены только самые популярные.

А теперь основные опции:

Большинство действий выполняются именно командами, а опции только помогают сделать вывод более удобным.

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

Список запущенных служб

Сначала давайте посмотрим все загруженные в память службы Linux. Для того чтобы отобразить только службы можно использовать фильтр по типу с помощью опции type:

systemctl list-units –type service


Как получить список служб

Обратите внимание, что команда не просто выводит текст, она передает этот текст утилите less. Здесь доступна прокрутка вверх и вниз, а также вправо и влево с помощью клавиш стрелок. Для того чтобы выйти обратно в терминал нажмите клавишу q.

Команда отобразила все службы, которые известны systemd, они сейчас запущены или были запущены. Systemd не пересматривает все файлы юнитов при выполнении этой команды. В выводе утилиты есть несколько колонок:

Дальше больше. Вы можете отфильтровать список служб systemctl по состоянию с помощью опции state. Например, только выполняющиеся:

systemctl list-units –type service –state running


Как получить список служб

Или те, которые завершились с ошибкой:

systemctl list-units –type service –state failed


Как получить список служб

Для фильтрации можно брать любое значение состояния из колонки ACTIVE или SUB.

Список всех служб

В предыдущем пункте было показано как посмотреть список служб, которые уже загружены в память systemd. Но для того чтобы посмотреть все службы необходимо обратиться к файлам юнитов, потому что далеко не все службы загружаются в память.

Для этого понадобится команда list-unit-files. Например, для вывода вообще всех юнитов воспользуйтесь такой командой:


Как получить список служб

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

systemctl list-unit-files –type service


Как получить список служб

Здесь вы тоже можете использовать фильтры по состоянию, но значения будут уже другие. Теперь вы знаете как посмотреть запущенные службы Linux.

Поиск службы по имени

Если вы хотите найти определенную службу, но не знаете её полное имя, то можете использовать фильтр по паттерну. Например, так можно вывести все службы, которые начинаются со слова mysql:

systemctl list-unit-files ‘mysql*’


Как получить список служб

Запуск службы

Для того чтобы запустить службу используется команда start. Ей необходимо передать имя службы в качестве параметра:

sudo systemctl start имя_службы.service

Например, для запуска Nginx выполните:

sudo systemctl start nginx.service


Как получить список служб

Причем расширение service можно опустить, оно и так подставляется по умолчанию. Если запуск прошел хорошо, программа ничего не выведет.

Остановка службы

Остановить службу linux можно командой:

sudo systemctl stop имя_службы.service

Например, для остановки Nginx можно использовать такую команду:

sudo systemctl stop nginx


Как получить список служб

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

sudo systemctl stop ‘php*.service’

Но это будет работать только для запущенных служб. Запускать службы таким образом нельзя. Сопоставление по паттерну работает только для заруженных в память юнитов, а поэтому невозможно быть уверенным что список для запуска будет полным.

Перезапуск службы

Есть два способа перезагрузки служб. Это полная перезагрузка с помощью команды restart, которая включает завершение программы и её запуск, а также так называемая мягкая перезагрузка, когда systemd просит программу перечитать конфигурацию с диска. Такая перезагрузка выполняется с помощью команды reload, однако далеко не все сервисы её поддерживают.

Для полной перезагрузки Nginx выполните такую команду:

sudo systemctl restart nginx

Для того чтобы попросить программу перечитать свою конфигурацию используйте команду reload:

sudo systemctl reload nginx

Если служба не поддерживает этого, вы получите ошибку. Для того чтобы избежать этого и перезапустить службу полностью если мягкая перезагрузка не поддерживается используйте команду reload-or-restart. Например:

sudo systemctl reload-or-restart nginx

Состояние службы

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

sudo systemctl status имя_службы

Например, для Nginx:

sudo systemctl status nginx


Как получить список служб

Здесь вы можете видеть текущее состояние процесса в поле Active. Возможные значения: active, inactive, failed, etc. Ещё тут выводится статистика по использованию памяти, количеству запущенных процессов и PID основного процесса. А также 10 последних строчек вывода программы, которые очень помогут решить проблему с запуском если она возникнет. Если этих данных вам не достаточно, то вы можете указать количество строк для вывода используя опцию –lines. Например:

sudo systemctl status –lines=50 avahi-daemon

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

sudo systemctl status -l nginx

Автозагрузка службы

Для того чтобы добавить службу в автозагрузку используйте команду enable. Например, команда добавления Nginx в автозагрузку будет выглядеть вот так:

sudo systemctl enable nginx

А для удаления из автозагрузки используйте команду disable. Например:

sudo systemctl disable nginx

Более подробно об автозагрузке в Systemd вы можете прочитать в статье Автозагрузка сервисов Linux.

Редактирование файла службы

Иногда возникает необходимость отредактировать файл службы. Например, для того чтобы добавить дополнительные переменные окружения или настроить автоматический перезапуск. Но редактировать сам файл сервиса в папке /usr/lib или /lib не желательно, поскольку при следующем обновлении пакета он будет перезаписан.

Вы можете скопировать файл юнита в папку /etc/systemd/system/ и редактировать его там. Специально для таких случаев была разработана команда edit. Если её использовать с опцией –full она создаст файл в папке /etc/systemd/* в котором вы можете изменять всё что вам нужно. Например, вы можете выполнить следующую команду для того чтобы отредактировать конфигурационный файл Nginx:

sudo systemctl edit –full nginx

Внесите нужные изменения и сохраните файл. Например, можно добавить переменную окружения SITE со значением losst:


Как получить список служб

Если же вы выполните команду edit без опции –full, то будет создана папка /etc/systemd/system/nginx.service.d, в которой появится файл override.conf. Здесь нужно разместить только параметры, которые вы хотите добавить или значения которых нужно переопределить Например, для добавления той же переменной окружения нужно добавить такую строку:

sudo systemctl edit nginx

Envirnoment=”SITE=losst”

После внесения изменений необходимо обновить конфигурацию Systemd с диска:

sudo systemctl daemon-reload

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

Удаление службы

Удалить службу можно удалив пакет, вместе с которым она поставляется. Однако если это стандартная служба, то это сделать не получится. Существует способ отключать юниты, если вы не хотите чтобы кто-то их использовал. Это маскировка. Для этого используйте команду mask:

sudo systemctl mask имя_сервиса

sudo systemctl mask nginx

Эта команда создает в папке /etc/systemd/system символическую ссылку на /dev/null с именем файла службы, после чего служба считается отключённой. Обратите внимание, что если вы редактировали файл юнита и в папке /etc/systemd/system уже существует его файл, то вы можете получить ошибку Failed to mask unit: File /etc/systemd/system/*.service already exists. В таком случае все ваши изменения нужно удалить командой revert. При выполнении этой команды ваши изменения будут удалены. Например:

sudo systemctl revert nginx

Информацию о том, что служба замаскирована можно увидеть в выводе команды status:


Как получить список служб

Для того чтобы вернуть всё как было выполните команду unmask:

sudo systemctl unmask nginx

Управление службами пользователей


Как получить список служб

Для просмотра состояния службы используется команда status. Например для службы dbus команда будет выглядеть так:

Выводы

Теперь управление службами Linux не вызовет у вас проблем. Много чего мы упустили, systemd – очень большая, сложная и многофункциональная система, которую не охватить в одной статье. Но я думаю, что все, что касается управления службами Linux мы разобрали. Если у вас остались вопросы, спрашивайте в комментариях!

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Оставьте комментарий