68 votes

Linux : Comment savoir où un processus a été lancé et comment il a été lancé ?

Je vérifiais une machine Linux et j'ai trouvé un processus perl en cours d'exécution qui prenait une bonne partie de l'utilisation du processeur. Avec top, je ne pouvais trouver que perl dans le nom du processus.

Lorsque j'ai appuyé sur c Si j'ai choisi d'afficher la ligne de commande, j'ai vu /var/spool/mail. Ce qui n'a pas de sens, puisqu'il s'agit d'un répertoire.

Mes questions sont les suivantes :

1) Pourquoi cela s'est-il produit ? Comment ce processus perl a-t-il pu masquer sa ligne de commande ? 2) Quel est le moyen le plus fiable de savoir où et comment un processus a été lancé ?

Gracias.

85voto

coredump Points 12455

La méthode la plus fiable consiste à consulter le /proc dir pour le processus. Chaque processus possède un /proc/<pid>/ où il conserve des informations telles que

  1. cwd lien vers le répertoire de travail actuel
  2. fd un répertoire contenant des liens vers les fichiers ouverts (descripteurs de fichiers)
  3. cmdline le lire pour savoir quelle ligne de commande a été utilisée pour lancer le processus
  4. environ les variables d'environnement de ce processus
  5. root un lien vers ce que le processus considère comme son répertoire racine (ce sera / à moins d'être chrooté)

Il y a d'autres informations intéressantes sur chaque processus /proc, mais avec ce qui précède, vous serez en mesure de savoir exactement ce qui se passe.

De même, l'utilisation de ps auxf vous montrera qui a forké quoi, ce qui vous permettra d'avoir une meilleure idée de qui appelle votre perl.

49voto

Eric Noob Points 531

Dans la plupart des cas, il suffit d'exécuter ps est généralement suffisant, ainsi que vos drapeaux préférés pour permettre une large diffusion. Je penche pour ps -feww mais les autres suggestions sont valables. Notez que si un programme a été lancé à partir de la base de données $PATH vous ne verrez que le nom de l'exécutable, et non le chemin d'accès complet. Par exemple, essayez ceci :

$ lftp &
$ ps -feww | grep ftp
lars      9600  9504  0 11:30 pts/10   00:00:00 lftp
lars      9620  9504  0 11:31 pts/10   00:00:00 grep ftp

Il est important de noter que les informations visibles dans la rubrique ps peut être complètement écrasé par le programme en cours d'exécution. Par exemple, ce code :

int main (int argc, char **argv) {
        memset(argv[0], ' ', strlen(argv[0]));
        strcpy(argv[0], "foobar");
        sleep(30);
        return(0);
}

Si je compile cela dans un fichier appelé "myprogram" et que je l'exécute :

$ gcc -o myprogram myprogram.c
$ ./myprogram &
[1] 10201

Et ensuite, lancez ps Je verrai un nom de processus différent :

$ ps -f -p 10201
UID        PID  PPID  C STIME TTY          TIME CMD
lars     10201  9734  0 11:37 pts/10   00:00:00 foobar

Vous pouvez également consulter directement /proc/<pid>/exe qui peut être un lien symbolique vers l'exécutable approprié. Dans l'exemple ci-dessus, cela vous donne des informations beaucoup plus utiles que ps :

$ls -l /proc/9600/exe
lrwxrwxrwx. 1 lars lars 0 Feb  8 11:31 /proc/9600/exe -> /usr/bin/lftp

29voto

infinite-etcetera Points 673

Pour ma part, je viens de découvrir que pstree a donné une indication beaucoup plus claire de la manière dont un processus a été lancé, que la méthode ps aux

il se présente comme suit :

  lightdmXorg
           lightdminitapache22*[apache226*[{apache2}]]
                          at-spi-bus-laundbus-daemon
                                           3*[{at-spi-bus-laun}]
                          at-spi2-registr{at-spi2-registr}
                          dbus-daemon
                          dropbox29*[{dropbox} ]

17voto

TVK Points 161

Que vous pouvez utiliser :

systemctl status <PID>

ou le nom du processus :

systemctl status $(pgrep perl)

Cela permet d'obtenir des informations sur les services systemd qui ont démarré votre processus.

J'ai trouvé cet indice aquí

3voto

Alex Points 7759

Pruebe ps axww | grep perl pour obtenir la ligne de commande complète de votre processus. Elle se présente comme suit top vient d'élaguer une longue ligne.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X