Как перечислить всех рабочих демонов?

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

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

Попытайтесь узнать больше о механизме сборки C/C++, чтобы помочь Вам понять это лучше.

34
13.04.2017, 15:36
3 ответа

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

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

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

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

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

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

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

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

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

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

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

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

$ 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. И вот так! Эта последняя строка перехватывает все не-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 ^?
52
27.01.2020, 19:36

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

У хороших демонов есть хорошо написанные скрипты запуска в /etc/initd

При изменении уровня запуска, как init узнает о запущенных демонах?

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

/var/lock/subsys

Так что можно

get the names list from there

scan all the running processes and check if the name is inside the list: bingo !

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

/proc

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

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

/proc/1234/status

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

См.

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

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

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

0
27.01.2020, 19:36

В современной системе под управлением systemd(на основе Debian, Fedora, RedHat/CentOs,... )команда systemctlпредназначена для обработки всего, что контролируется systemd. Итак, чтобы получить список сервисов, вы можете сделать:

systemctl | grep daemon
1
02.10.2020, 14:28

Теги

Похожие вопросы