Понятие демона привязано к процессам , а не к файлам . По этой причине нет смысла «находить демонов в файловой системе». Просто, чтобы сделать понятие немного яснее: программа представляет собой исполняемый файл (видимый в выводе 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 ^?
network-manager
неNetworkManager
.