Comment lister tous les démons en cours d'exécution?

32

D'après ma question , il était clair que je ne peux pas facilement décider des fonctionnalités d'un démon. J'ai lu dans différents articles et sur différents forums que la service --status-allcommande peut être utilisée pour répertorier tous les démons de mon système. Mais je ne pense pas que la commande répertorie tous les démons car NetworkManager, un démon qui s'exécute actuellement sur mon Ubuntu 14.04système, n'est pas répertorié par la commande. Existe-t-il une commande pour répertorier les démons en cours d'exécution ou bien existe-t-il un moyen de trouver les démons à partir de filesystemlui-même?

Jackzz
la source
Êtes-vous sûr qu'il n'est pas répertorié? Comment vérifiez-vous? Je peux le voir sur mon Debian. Notez que le nom ne l'est network-managerpas NetworkManager.
terdon
Oui. Je suis sûr. Aucun élément lié au terme réseau n'est répertorié. Il répertorie également ce anacronqui n'est pas mentionné comme un démon dans son script d'initialisation.
Jackzz
Anacron n'étant pas un démon est plus une question de sémantique car il n'est pas exécuté en permanence. Il est toujours exécuté en tant que service, ce que vous appelez normalement des démons. Veuillez modifier votre question et i) nous dire quel Ubuntu vous utilisez et ii) ce que vous entendez exactement par «démon». Quel est votre objectif final ici?
terdon
Je suppose que tout service exécuté en arrière-plan est un démon. Je l'ai mentionné anacronparce qu'il a été dit /etc/init.d/anacronque ce n'est pas un démon. Mon objectif est d'écrire un C++programme pour lister tous les démons en cours d'exécution sur mon système. Pour cela, j'ai besoin de savoir quels fichiers analyser pour obtenir les détails.
Jackzz
1
Eh bien, si vous définissez les démons comme des services, service --status-allc'est ce dont vous avez besoin. Ubuntu semble traiter NetworkManager différemment. J'obtiens à la fois networkinget network-managerdans la sortie de services --status-allsur Debian mais uniquement networkingsur Ubuntu. Je pense que vous devez définir ce que vous entendez exactement par «démon».
terdon

Réponses:

52

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 ttychamp 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' -Uswitch.

$ 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 --deselectcommutateur.

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, psa un -Ccommutateur qui nous permet de sélectionner par nom de commande. Nous venons de recevoir notre liste de commandes, alors injectons-la dans la psligne de commande. Notez que j'utilise --deselectensuite 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 ttyde 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 grepcapture 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 ^?
John WH Smith
la source
linux conserve de nombreuses informations sur un système de fichiers virtuel, procfs. il est donc possible de "trouver des démons sur le système de fichiers" !!!
Massimo
0

J'ai écrit pour le "vieux" initd sysv, vous devez vérifier s'il fonctionne sur votre distribution.

Les bons démons ont des scripts de démarrage bien écrits dans / etc / initd

Lors de la modification du niveau d'exécution, comment init connaît-il les démons en cours d'exécution?

Il recherche leurs noms dans le répertoire

/ var / lock / subsys

Afin que vous puissiez

obtenir la liste des noms à partir de là

scannez tous les processus en cours et vérifiez si le nom est dans la liste: bingo!

Pour analyser tous les processus: répertoriez tous les sous-répertoires

/ proc

Si son nom est des chiffres, c'est le pid d'un processus en cours.

Par exemple, l'état du processus avec le pid 1234 est ce fichier

/ proc / 1234 / status

Ouvrez-le et obtenez la première ligne, commence par "Nom:"

Voir

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

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

(désolé pour le formatage désagréable, j'écris depuis mon téléphone portable ...)

Massimo
la source