Ř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:
cwd
odkaz na aktuální pracovní adresářfd
adresář s odkazy na otevřené soubory (deskriptory souborů)cmdline
přečtěte si jej, abyste viděli, jaký příkazový řádek byl použit ke spuštění procesuenviron
proměnné prostředí pro tento procesroot
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.