web-dev-qa-db-fra.com

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

D'après mon 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 commande service --status-all Peut être utilisée pour lister tous les démons dans 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 dans mon système Ubuntu 14.04, 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 du filesystem lui-même?

36
Jackzz

La notion de démon est attachée aux processus , pas 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 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 champ de sortie tty 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 commutateur.

$ 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 existe un programme pour lister les processus GUI: xlsclients! Cette réponse de slm nous indique comment l'utiliser pour lister 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 ligne de commande ps. Notez que j'utilise --deselect par la suite 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 d'afficher 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 ^?

Le dernier grep capture toutes les lignes qui commencent 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 à l'exclusion des threads du noya (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 ^?
52
John WH Smith

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 ...)

0
Massimo