Solution 1 :
Le moyen le plus fiable est de regarder le /proc
dir pour le processus. Chaque processus a un /proc/<pid>/
répertoire où il conserve des informations telles que :
cwd
lien vers le répertoire de travail courantfd
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 étant le répertoire racine (il sera / à moins d'être chrooté)
Il y a plus d'informations intéressantes sur chaque processus /proc, mais avec celles ci-dessus, vous pourrez savoir exactement ce qui se passe.
Aussi, en utilisant ps auxf
vous montrera qui a forké quoi afin que vous puissiez avoir une meilleure idée de qui appelle votre perl.
Solution 2 :
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 sortie large. Je penche pour ps -feww
, mais les autres suggestions ici fonctionneront. Notez que si un programme a été démarré à partir du $PATH
de quelqu'un , 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 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 ceci dans un fichier appelé "myprogram" et que je 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 consulter directement /proc/<pid>/exe
, qui peut être un lien symbolique vers l'exécutable approprié. Dans l'exemple ci-dessus, cela vous donne beaucoup plus d'informations utiles que ps
:
$ls -l /proc/9600/exe
lrwxrwxrwx. 1 lars lars 0 Feb 8 11:31 /proc/9600/exe -> /usr/bin/lftp
Solution 3 :
pour moi, tout à l'heure, j'ai trouvé que pstree
a donné une indication beaucoup plus claire de la façon dont un processus a été lancé, que ps aux
ça ressemble à ça :
├─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} ]
Solution 4 :
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
Solution 5 :
Essayez ps axww | grep perl
pour obtenir la ligne de commande complète de votre processus. Il ressemble à top
vient de couper une longue ligne.