Как составить список всех запущенных демонов?

32

Из моего вопроса стало ясно, что я не могу легко определить функции демона. Я читал в разных статьях и на разных форумах, что эту service --status-allкоманду можно использовать для вывода списка всех демонов в моей системе. Но я не думаю, что команда перечисляет все демоны, потому NetworkManagerчто демон, который в данный момент работает в моей Ubuntu 14.04системе, не указан командой. Есть ли какая-нибудь команда для вывода списка запущенных демонов, или есть какой-то способ найти демонов из самого filesystemсебя?

Jackzz
источник
Вы уверены, что его нет в списке? Как вы проверяете? Я вижу это на своем Debian. Обратите внимание, что имя network-managerне NetworkManager.
Terdon
Да. Я уверен. Ничто, связанное с термином сеть, не перечислено. Также он перечисляет, anacronчто упоминается как не демон в своем скрипте инициализации.
Джекз
Anacron не является демоном, это больше вопрос семантики, потому что он не запускается постоянно. Он по-прежнему работает как служба, которую вы обычно называете демонами. Пожалуйста, отредактируйте свой вопрос, и я) скажите нам, какой Ubuntu вы используете, и ii) что именно вы подразумеваете под "демоном". Какова ваша конечная цель здесь?
Terdon
Я полагаю, что любой сервис, работающий в фоновом режиме, является демоном. Я упомянул, anacronпотому что было сказано, /etc/init.d/anacronчто это не демон. Моя цель - написать C++программу для перечисления всех демонов, работающих в моей системе. Для этого мне нужно знать, какие файлы анализировать, чтобы получить детали.
Джекз
1
Хорошо, если вы определяете демонов как сервисы, service --status-allэто то , что вам нужно. Ubuntu, похоже, относится к NetworkManager по-другому. Я получаю оба networkingи network-managerв выводе services --status-allна Debian, но только networkingна Ubuntu. Я думаю, вам нужно определить, что именно вы подразумеваете под "демоном".
Terdon

Ответы:

52

Понятие демона привязано к процессам , а не к файлам . По этой причине нет смысла «находить демонов в файловой системе». Просто, чтобы сделать понятие немного яснее: программа представляет собой исполняемый файл (видимый в выводе ls); процесс - это экземпляр этой программы (видимый в выходных данных ps).

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

$ ps -eo 'tty,pid,comm' | grep ^?

Поле ttyвывода содержит «?» когда процесс не имеет управляющего терминала.

Большая проблема возникает тогда, когда ваша система работает в графической среде. Поскольку программы с графическим интерфейсом (например, Chromium) не подключены к терминалу, они также появляются в выходных данных. В стандартной системе, где root не запускает графические программы, вы можете просто ограничить предыдущий список процессами root. Это может быть достигнуто с помощью ps" -Uпереключателя.

$ ps -U0 -o 'tty,pid,comm' | grep ^?

Тем не менее, здесь возникают две проблемы:

  • Если root запускает графические программы, они будут отображаться.
  • Демоны, работающие без прав root, не будут. Обратите внимание, что демоны, которые запускаются во время загрузки, обычно работают от имени пользователя root.

По сути, мы хотели бы отобразить все программы без управляющего терминала, но не программы с графическим интерфейсом . К счастью для нас, есть программа для отображения процессов графического интерфейса xlsclients:! Этот ответ от slm говорит нам, как использовать его для вывода списка всех программ с графическим интерфейсом, но нам придется изменить его, так как мы хотим исключить их. Это можно сделать с помощью --deselectпереключателя.

Сначала мы составим список всех программ с графическим интерфейсом, для которых у нас запущены процессы. Из ответа, который я только что связал, это делается с помощью ...

$ xlsclients | cut -d' ' -f3 | paste - -s -d ','

Теперь psесть -Cпереключатель, который позволяет нам выбирать по имени команды. Мы только что получили наш список команд, поэтому давайте добавим его в psкомандную строку. Обратите внимание, что я использую --deselectвпоследствии, чтобы отменить мой выбор.

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect

Теперь у нас есть список всех процессов без графического интерфейса. Давайте не будем забывать наше правило "нет связи с TTY". Для этого я добавлю -o tty,argsк предыдущей строке, чтобы вывести ttyкаждый процесс (и его полную командную строку):

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?

Финал grepзахватывает все строки, которые начинаются с «?», То есть все процессы без контролируемого tty. И вот, пожалуйста! Эта последняя строка дает вам все не-GUI процессы, запущенные без управляющего терминала. Обратите внимание, что вы все еще можете улучшить его, например, исключив потоки ядра (которые не являются процессами) ...

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?

... или добавив несколько столбцов информации для чтения:

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?
Джон У. Смит
источник
Linux хранит много информации о виртуальной файловой системе, procfs. так что выполнимо "найти демонов в файловой системе" !!!
Массимо
0

Я написал для "старого" sysv initd, вы должны проверить, работает ли он на вашем дистрибутиве.

Хорошие демоны хорошо написали сценарии запуска в / etc / initd

При изменении уровня выполнения откуда init знает работающие демоны?

Он ищет их имена в каталоге

/ вар / блокировка / Subsys

Так что вы можете

получить список имен оттуда

просканируйте все запущенные процессы и проверьте, находится ли имя в списке: bingo!

Чтобы просмотреть все процессы: перечислите каждый подкаталог в

/ Proc

Если его имя состоит из цифр, это pid запущенного процесса.

Например, статус процесса с pid 1234 - это файл

/ Proc / 1234 / статус

Откройте его и получите первую строку, начинающуюся с «Имя:»

Видеть

http://man7.org/linux/man-pages/man5/proc.5.html

https://linuxexplore.com/2014/03/19/use-of-subsystem-lock-files-in-init-script/

(извините за неприятное форматирование, я пишу с моего мобильного телефона ...)

Massimo
источник