GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿Cómo saber dónde se inició un proceso y cómo se inició?

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:

  1. cwd enlace al directorio de trabajo actual
  2. fd un directorio con enlaces a los archivos abiertos (descriptores de archivos)
  3. cmdline léelo para ver qué línea de comando se usó para iniciar el proceso
  4. environ las variables de entorno para ese proceso
  5. root 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.


Linux
  1. Cómo me deshice de mi antiguo sistema operativo y salté a Linux

  2. ¿Cómo empezaste con Linux?

  3. Cómo instalar vtop en Linux

  4. Cómo instalar y configurar Monit en Linux para el monitoreo de procesos

  5. ¿Cómo puedo registrar todos los inicios de procesos en Linux?

Cómo encontrar y matar procesos en ejecución en Linux

Cómo trabajar con procesos en primer plano y en segundo plano en Linux

Cómo MATAR un proceso en Linux

Cómo encontrar el PID y PPID de un proceso en Linux

Cómo matar procesos en Linux usando kill, killall y pkill

Cómo rastrear y rastrear un proceso de Linux