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é?
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:
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:
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
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:
cwd lien vers le répertoire de travail actuel
fd un répertoire avec des liens vers les fichiers ouverts (descripteurs de fichiers)
cmdline lisez-le pour voir quelle ligne de commande a été utilisée pour démarrer le processus
environ les variables d'environnement pour ce processus
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.
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
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.
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.
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!
/proc
fourniront toutes les informations sur un programme,exe
seront un lien vers l'exécutable,cwd
vers le répertoire de travail en cours, lefd
répertoire contient des liens vers des fichiers ouverts (y compris l'entrée, la sortie standard et l'erreur standard)Le moyen le plus fiable est de regarder le
/proc
répertoire du processus. Chaque processus a un/proc/<pid>/
répertoire où il conserve des informations comme:cwd
lien vers le répertoire de travail actuelfd
un répertoire avec des liens vers les fichiers ouverts (descripteurs de fichiers)cmdline
lisez-le pour voir quelle ligne de commande a été utilisée pour démarrer le processusenviron
les variables d'environnement pour ce processusroot
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 auxf
vous montrera qui a bifurqué quoi pour que vous puissiez avoir une meilleure idée de qui appelle votre perl.la source
/proc
contient des informations sur les processus! qui savait?? tout ce que j'ai jamais cherché là-bas étaitversion
etcpuinfo
et 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ètreschroot()
avant, comment savoir à quel répertoire/proc/ᴘɪᴅ/cwd
correspond?pour moi, tout à l'heure, j'ai trouvé que cela
pstree
donnait une indication beaucoup plus claire de la façon dont un processus avait commencé, queps aux
cela ressemble à ceci:
la source
Essayez
ps axww | grep perl
d'obtenir la ligne de commande complète de votre processus. On dirait quetop
juste coupé une longue ligne.la source
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.
la source
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.
la source
Deux commandes me viennent à l'esprit:
1) obtenir l'heure de début du processus à partir de « ps ».
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:
Mais comme l'ont dit quelques personnes, "ls -al / proc /" vous en dira beaucoup!
la source
vous pouvez utiliser:
ou avec le nom du processus:
Cela fournira des informations sur les services systemd qui ont démarré votre processus.
J'ai trouvé cet indice ici
la source