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

34

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

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

Mes questions sont:

1) Pourquoi est-ce arrivé? Comment ce processus perl pourrait masquer sa ligne de commande? 2) Quelle est la manière la plus fiable de savoir où et comment un processus a commencé?

Merci!

Fernando
la source

Réponses:

36

Dans la plupart des cas, une simple exécution psest généralement suffisante, ainsi que vos indicateurs préférés pour permettre une sortie large. Je me penche vers ps -feww, mais les autres suggestions ici fonctionneront. Notez que si un programme a été démarré à partir de quelqu'un $PATH, vous ne verrez que le nom de l'exécutable, pas le chemin 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 pspeuvent être complètement écrasées 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 ceci dans un fichier appelé "monprogramme" et l'exécute:

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

Et puis exécutez 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 regarder 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
alsacs
la source
1
tous, dans l'ensemble, les fichiers dans /procfourniront toutes les informations sur un programme, exeseront un lien vers l'exécutable, cwdvers le répertoire de travail en cours, le fdrépertoire contient des liens vers des fichiers ouverts (y compris l'entrée, la sortie standard et l'erreur standard)
Hubert Kario
57

Le moyen le plus fiable est de regarder le /procrépertoire du processus. Chaque processus a un /proc/<pid>/répertoire où il conserve des informations comme:

  1. cwd lien vers le répertoire de travail actuel
  2. fd un répertoire avec des liens vers les fichiers ouverts (descripteurs de fichiers)
  3. cmdline lisez-le pour voir quelle ligne de commande a été utilisée pour démarrer le processus
  4. environ les variables d'environnement pour ce processus
  5. root un lien vers ce que le processus considère comme le répertoire racine (il sera / sauf si chrooté)

Il y a plus d'informations intéressantes sur chaque processus / proc, mais avec ceux ci-dessus, vous pourrez savoir exactement ce qui se passe.

En outre, l'utilisation ps auxfvous montrera qui a bifurqué quoi pour que vous puissiez avoir une meilleure idée de qui appelle votre perl.

coredump
la source
J'utilise toujours Process Explorer sous Windows et je me demandais s'il y avait un équivalent sous Linux. Ce commutateur fait tout! ps auxf ... sympa!
Yanick Girouard
1
+1 pour le paramètre f pour ps, ça l'a fait pour moi!
Lennart Rolland
2
+1 pour m'avoir appris ce qui semble être un concept aussi fondamental ... /proccontient des informations sur les processus! qui savait?? tout ce que j'ai jamais cherché là-bas était versionet cpuinfoet d'autres choses ... en plus cela résout mon problème réel parce que la version de mon routeur de ps ignore tous les paramètres
Nacht - Reinstate Monica
@coredump: et si le processus appelé chroot()avant, comment savoir à quel répertoire /proc/ᴘɪᴅ/cwdcorrespond?
user2284570
10

pour moi, tout à l'heure, j'ai trouvé que cela pstreedonnait une indication beaucoup plus claire de la façon dont un processus avait commencé, queps aux

cela ressemble à ceci:

  ├─lightdm─┬─Xorg
  │         ├─lightdm─┬─init─┬─apache2───2*[apache2───26*[{apache2}]]
  │         │         │      ├─at-spi-bus-laun─┬─dbus-daemon
  │         │         │      │                 └─3*[{at-spi-bus-laun}]
  │         │         │      ├─at-spi2-registr───{at-spi2-registr}
  │         │         │      ├─dbus-daemon
  │         │         │      ├─dropbox───29*[{dropbox} ]
infinite-etcetera
la source
2

Essayez ps axww | grep perld'obtenir la ligne de commande complète de votre processus. On dirait que topjuste coupé une longue ligne.

Alex
la source
2

Commande Try use fuser -vu /var/spool/mail Cette commande vous affiche les PID des processus utilisant les fichiers ou systèmes de fichiers spécifiés. Dans le mode d'affichage par défaut, chaque nom de fichier est suivi d'une lettre indiquant le type d'accès:

c - répertoire courant. e - exécutable en cours d'exécution. f - ouvrir le fichier. f est omis en mode d'affichage par défaut. r - répertoire racine. Fichier m-mmap ou bibliothèque partagée.

Peut-être que cela vous aidera à faire avancer votre recherche pour répondre à ce que vous recherchez. Je ne sais pas si cela vous aide mais peut-être trouverez-vous des informations utiles.

panaroik
la source
1

Sans consulter la page de manuel pour les drapeaux exacts, un moyen facile de déterminer la ligne de commande et l'heure de début, ps auxwww devrait fonctionner. Vous pouvez le rendre plus élégant si vous le souhaitez en lisant la page de manuel.

Jason Tan
la source
1

Deux commandes me viennent à l'esprit:

1) obtenir l'heure de début du processus à partir de « ps ».

$ ps -ax -o pid,start,comm
  PID  STARTED COMMAND         USER
    1   Feb 06 init            root
    2   Feb 06 kthreadd        root
[...]
  13147 19:09:48 chrome          hcooper
  13270 19:13:51 chrome          hcooper
  13386 19:18:34 bash            hcooper

2) lastcomm , que je vérifie maintenant, je ne l'ai pas installé. Quoi qu'il en soit, la description de la page de manuel indique:

   lastcomm prints out information about previously executed commands. If
   no arguments are specified, lastcomm will print info about all of the
   commands in acct (the record file).

Mais comme l'ont dit quelques personnes, "ls -al / proc /" vous en dira beaucoup!

Coops
la source
0

vous pouvez utiliser:

systemctl status <PID>

ou avec le nom du processus:

systemctl status $(pgrep perl)

Cela fournira des informations sur les services systemd qui ont démarré votre processus.

J'ai trouvé cet indice ici

TVK
la source