Як перелічити всі запущені демони?


32

З мого запитання було зрозуміло, що я не можу легко визначити особливості демона. Я читав у різних статтях та на різних форумах, що service --status-allкоманда може бути використана для переліку всіх демонів у моїй системі. Але я не думаю, що команда перераховує всі демони, тому NetworkManagerщо демон, який зараз працює в моїй Ubuntu 14.04системі, не вказаний командою. Чи є якась команда перерахувати запущені демони чи ще є спосіб знайти демони у filesystemсебе?


Ви впевнені, що він не вказаний? Як ви перевіряєте? Я бачу це на своєму Debian. Зауважте, що ім'я є network-manager, ні NetworkManager.
тердон

Так. Я впевнений. Нічого, що стосується терміна мережі, не вказано. Крім того, він перераховує, anacronщо в його сценарії init згадується як не демон.
Джекзз

Анакрон не є демоном - це скоріше питання семантики, тому що він не працює постійно. Він як і раніше працює як послуга, яку ви зазвичай називаєте демонами. Будь ласка, відредагуйте своє запитання, і я скажіть, у якому Ubuntu ви працюєте, і ii) що саме ви маєте на увазі під «демоном». Яка ваша кінцева мета тут?
тердон

Я думаю, що будь-яка служба, що працює у фоновому режимі, - демон. Я згадав, anacronбо було сказано, /etc/init.d/anacronщо це не демон. Моя мета - написати C++програму, щоб перелічити всі демони, що працюють в моїй системі. Для цього мені потрібно знати, які файли аналізувати, щоб отримати деталі.
Джекзз

1
Що ж, якщо ви визначаєте демонів як послуги - service --status-allце те, що вам потрібно. Здається, Ubuntu по-різному ставиться до NetworkManager. Я отримую networkingі network-managerна виході services --status-allDebian, але тільки networkingна Ubuntu. Я думаю, вам потрібно визначити, що саме ви маєте на увазі під «демоном».
terdon

Відповіді:


52

Поняття демона приєднується до процесів , а не до файлів . З цієї причини "знайти демони у файловій системі" немає сенсу. Просто, щоб зробити поняття трохи зрозумілішим: програма - це виконуваний файл (видно на виході ls); процес - це екземпляр цієї програми (видно на виході ps).

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

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

Поле ttyвиводу містить "?" коли процес не має керуючого терміналу.

Велика проблема тут виникає, коли ваша система працює з графічним середовищем. Оскільки програми GUI (тобто Chromium) не приєднані до терміналу, вони також з'являються у висновку. У стандартній системі, де root не запускає графічні програми, ви можете просто обмежити попередній список процесами root. Це можна досягти за допомогою перемикача ps' -U.

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

Однак тут виникають дві проблеми:

  • Якщо у root запущені графічні програми, вони з’являться.
  • Демони, що працюють без привілеїв root, не будуть. Зауважте, що демони, які починаються під час завантаження, зазвичай працюють як root.

В основному, ми хотіли б відображати всі програми без керуючого терміналу, але не програми GUI . На щастя для нас, існує програма, яка містить список графічних процесів xlsclients:! Ця відповідь від slm вказує нам, як за допомогою нього перелічити всі програми GUI, але нам доведеться його змінити, оскільки ми хочемо їх виключити. Це можна зробити за допомогою --deselectперемикача.

Спочатку ми створимо список усіх програм GUI, для яких у нас запущені процеси. З відповіді, яку я щойно зв'язав, це робиться за допомогою ...

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

Тепер psє -Cперемикач, який дозволяє нам вибирати по імені команди. Ми щойно отримали наш список команд, тож давайте введемо його в psкомандний рядок. Зауважте, що я використовую --deselectзгодом, щоб змінити вибір.

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

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

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

Кінцевий grepфіксує всі рядки, які починаються з "?", Тобто всі процеси без контрольного tty. І ось ти йдеш! Цей заключний рядок надає всі процеси, що не мають графічного інтерфейсу, що працюють без керуючого терміналу. Зауважте, що ви все ще можете вдосконалити його, наприклад, виключивши нитки ядра (які не є процесами) ...

$ 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 знає бігові демони?

Шукає їхні назви в довіднику

/ var / lock / subsys

Так можна

отримати звідти список імен

скануйте всі запущені процеси та перевірте, чи є ім’я у списку: бінго!

Щоб сканувати всі процеси: перерахуйте кожен підкаталог в

/ проц

Якщо його ім'я є цифрами, це пристрій запущеного процесу.

Наприклад, статус процесу з 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/

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.