Solución 1:
La forma más confiable es mirar el /proc
dir para el proceso. Cada proceso tiene un /proc/<pid>/
directorio donde guarda información como:
cwd
enlace al directorio de trabajo actualfd
un directorio con enlaces a los archivos abiertos (descriptores de archivos)cmdline
léelo para ver qué línea de comando se usó para iniciar el procesoenviron
las variables de entorno para ese procesoroot
un enlace a lo que el proceso considera que es el directorio raíz (será/a menos que se haga chroot)
Hay más información interesante sobre cada proceso/proc, pero con los anteriores podrá saber exactamente qué está pasando.
Además, usando ps auxf
le mostrará quién bifurcó qué para que pueda tener una mejor idea de quién está llamando a su perl.
Solución 2:
En la mayoría de los casos, simplemente ejecuta ps
suele ser suficiente, junto con sus banderas favoritas para habilitar una salida amplia. Me inclino por ps -feww
, pero las otras sugerencias aquí funcionarán. Tenga en cuenta que si un programa se inició desde el $PATH
de alguien , solo verá el nombre del ejecutable, no la ruta completa. Por ejemplo, prueba esto:
$ 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
Es importante tener en cuenta que la información visible en ps
puede ser completamente sobrescrito por el programa en ejecución. Por ejemplo, este código:
int main (int argc, char **argv) {
memset(argv[0], ' ', strlen(argv[0]));
strcpy(argv[0], "foobar");
sleep(30);
return(0);
}
Si compilo esto en un archivo llamado "myprogram" y lo ejecuto:
$ gcc -o myprogram myprogram.c
$ ./myprogram &
[1] 10201
Y luego ejecuta ps
, veré un nombre de proceso diferente:
$ ps -f -p 10201
UID PID PPID C STIME TTY TIME CMD
lars 10201 9734 0 11:37 pts/10 00:00:00 foobar
También puedes mirar directamente a /proc/<pid>/exe
, que puede ser un enlace simbólico al ejecutable apropiado. En el ejemplo anterior, esto le brinda mucha más información útil que ps
:
$ls -l /proc/9600/exe
lrwxrwxrwx. 1 lars lars 0 Feb 8 11:31 /proc/9600/exe -> /usr/bin/lftp
Solución 3:
para mí, justo ahora, encontré que pstree
dio una indicación mucho más clara de cómo se inició un proceso, que ps aux
se ve así:
├─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} ]
Solución 4:
puedes usar:
systemctl status <PID>
o con el nombre del proceso:
systemctl status $(pgrep perl)
Esto proporcionará información sobre los servicios de systemd que iniciaron su proceso.
Encontré esta pista aquí
Solución 5:
Prueba ps axww | grep perl
para obtener la línea de comando completa de su proceso. Parece top
acaba de recortar una línea larga.