La notion de démon est attachée aux processus , pas aux fichiers . Pour cette raison, cela n'a aucun sens de "trouver des démons sur le système de fichiers". Juste pour rendre la notion un peu plus claire: un programme est un fichier exécutable (visible dans la sortie de ls
); un processus est une instance de ce programme (visible dans la sortie de ps
).
Maintenant, si nous utilisons les informations que j'ai fournies dans ma réponse , nous pourrions trouver des démons en cours d'exécution en recherchant des processus qui s'exécutent sans qu'un terminal de contrôle ne leur soit attaché . Cela peut être fait assez facilement avec ps
:
$ ps -eo 'tty,pid,comm' | grep ^?
Le tty
champ de sortie contient "?" lorsque le processus n'a pas de terminal de contrôle.
Le gros problème vient ici lorsque votre système exécute un environnement graphique. Étant donné que les programmes GUI (c'est-à-dire Chromium) ne sont pas connectés à un terminal, ils apparaissent également dans la sortie. Sur un système standard, où root n'exécute pas de programmes graphiques, vous pouvez simplement restreindre la liste précédente aux processus de root. Ceci peut être réalisé en utilisant ps
' -U
switch.
$ ps -U0 -o 'tty,pid,comm' | grep ^?
Pourtant, deux problèmes se posent ici:
- Si root exécute des programmes graphiques, ils s'afficheront.
- Les démons fonctionnant sans privilèges root ne le seront pas. Notez que les démons qui démarrent au démarrage s'exécutent généralement en tant que root.
Fondamentalement, nous aimerions afficher tous les programmes sans terminal de contrôle, mais pas les programmes GUI . Heureusement pour nous, il y a un programme de processus GUI liste: xlsclients
! Cette réponse de slm nous indique comment l'utiliser pour répertorier tous les programmes GUI, mais nous devrons l'inverser, car nous voulons les exclure. Cela peut être fait en utilisant le --deselect
commutateur.
Tout d'abord, nous allons créer une liste de tous les programmes GUI pour lesquels nous avons des processus en cours d'exécution. D'après la réponse que je viens de relier, cela se fait en utilisant ...
$ xlsclients | cut -d' ' -f3 | paste - -s -d ','
Maintenant, ps
a un -C
commutateur qui nous permet de sélectionner par nom de commande. Nous venons de recevoir notre liste de commandes, alors injectons-la dans la ps
ligne de commande. Notez que j'utilise --deselect
ensuite pour inverser ma sélection.
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect
Maintenant, nous avons une liste de tous les processus non GUI. N'oublions pas notre règle «aucun ATS attaché». Pour cela, je vais ajouter -o tty,args
à la ligne précédente afin de sortir le tty
de chaque processus (et sa ligne de commande complète):
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?
La finale grep
capture toutes les lignes commençant par "?", C'est-à-dire tous les processus sans tty de contrôle. Et voilà! Cette dernière ligne vous donne tous les processus non-GUI s'exécutant sans terminal de contrôle. Notez que vous pouvez toujours l'améliorer, par exemple, en excluant les threads du noyau (qui ne sont pas des processus) ...
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?
... ou en ajoutant quelques colonnes d'informations à lire:
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?
network-manager
pasNetworkManager
.