GNU/Linux >> Znalost Linux >  >> Linux

Linux:Jak zjistit, kde byl proces spuštěn a jak byl spuštěn?

Řešení 1:

Nejspolehlivějším způsobem je podívat se na /proc dir pro proces. Každý proces má /proc/<pid>/ adresář, kde uchovává informace jako:

  1. cwd odkaz na aktuální pracovní adresář
  2. fd adresář s odkazy na otevřené soubory (deskriptory souborů)
  3. cmdline přečtěte si jej, abyste viděli, jaký příkazový řádek byl použit ke spuštění procesu
  4. environ proměnné prostředí pro tento proces
  5. root odkaz na to, co proces považuje za kořenový adresář (bude / pokud nebude chrootován)

O každém procesu /proc je více skvělých informací, ale s těmi výše budete moci přesně vědět, co se děje.

Také pomocí ps auxf vám ukáže, kdo co forkoval, takže můžete získat lepší představu, kdo volá váš perl.

Řešení 2:

Ve většině případů stačí spustit ps je obvykle dostačující, spolu s vašimi oblíbenými příznaky, abyste umožnili široký výstup. Přikláním se k ps -feww , ale ostatní návrhy zde budou fungovat. Všimněte si, že pokud byl program spuštěn z něčího $PATH , uvidíte pouze název spustitelného souboru, nikoli úplnou cestu. Zkuste například toto:

$ 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

Je důležité si uvědomit, že informace jsou viditelné v ps může být spuštěným programem zcela přepsán. Například tento kód:

int main (int argc, char **argv) {
        memset(argv[0], ' ', strlen(argv[0]));
        strcpy(argv[0], "foobar");
        sleep(30);
        return(0);
}

Pokud to zkompiluji do souboru s názvem „myprogram“ a spustím jej:

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

A pak spusťte ps , uvidím jiný název procesu:

$ ps -f -p 10201
UID        PID  PPID  C STIME TTY          TIME CMD
lars     10201  9734  0 11:37 pts/10   00:00:00 foobar

Můžete se také podívat přímo na /proc/<pid>/exe , což může být symbolický odkaz na příslušný spustitelný soubor. Ve výše uvedeném příkladu to poskytuje mnohem užitečnější informace než ps :

$ls -l /proc/9600/exe
lrwxrwxrwx. 1 lars lars 0 Feb  8 11:31 /proc/9600/exe -> /usr/bin/lftp

Řešení 3:

pro mě jsem právě teď našel, že pstree poskytl mnohem jasnější informaci o tom, jak byl proces spuštěn, než ps aux

vypadá to takto:

  ├─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} ]

Řešení 4:

můžete použít:

systemctl status <PID>

nebo s názvem procesu:

systemctl status $(pgrep perl)

Tím se doručí informace o službách systemd, které zahájily váš proces.

Tuto nápovědu jsem našel zde

Řešení 5:

Zkuste ps axww | grep perl získat celý příkazový řádek vašeho procesu. Vypadá to jako top právě ořezal dlouhou čáru.


Linux
  1. Jak jste začali s Linuxem?

  2. Jak spustit příkaz Linux na pozadí a odpojit proces v terminálu

  3. Jak zjistím, zda byl můj server Linux napaden hackery?

  1. Jak zabít proces zombie na Linuxu

  2. Jak jsem zahodil svůj starý OS a skočil do Linuxu

  3. Jak najít a zabít zombie proces v Linuxu

  1. Jak nainstalovat vtop na Linux

  2. Jak nainstalovat a nakonfigurovat Monit na Linuxu pro monitorování procesů

  3. Jak mohu zaznamenat všechna spuštění procesů v Linuxu?