Soluzione 1:
Il modo più affidabile è guardare lo /proc
dir per il processo. Ogni processo ha un /proc/<pid>/
directory in cui conserva informazioni come:
cwd
collegamento alla directory di lavoro correntefd
una directory con collegamenti ai file aperti (descrittori di file)cmdline
leggilo per vedere quale riga di comando è stata utilizzata per avviare il processoenviron
le variabili di ambiente per quel processoroot
un collegamento a ciò che il processo considera la sua directory principale (sarà / a meno che non venga eseguito il chroot)
Ci sono più informazioni interessanti su ogni processo /proc, ma con quelle sopra sarai in grado di sapere esattamente cosa sta succedendo.
Inoltre, usando ps auxf
ti mostrerà chi ha biforcato cosa in modo da farti un'idea migliore di chi sta chiamando il tuo perl.
Soluzione 2:
Nella maggior parte dei casi è sufficiente eseguire ps
di solito è sufficiente, insieme ai tuoi flag preferiti per abilitare un output ampio. Mi propongo per ps -feww
, ma gli altri suggerimenti qui funzioneranno. Nota che se un programma è stato avviato dal $PATH
di qualcuno , vedrai solo il nome dell'eseguibile, non il percorso completo. Ad esempio, prova questo:
$ 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
È importante notare che le informazioni visibili in ps
può essere completamente sovrascritto dal programma in esecuzione. Ad esempio, questo codice:
int main (int argc, char **argv) {
memset(argv[0], ' ', strlen(argv[0]));
strcpy(argv[0], "foobar");
sleep(30);
return(0);
}
Se lo compilo in un file chiamato "myprogram" e lo eseguo:
$ gcc -o myprogram myprogram.c
$ ./myprogram &
[1] 10201
E poi esegui ps
, vedrò un nome di processo diverso:
$ ps -f -p 10201
UID PID PPID C STIME TTY TIME CMD
lars 10201 9734 0 11:37 pts/10 00:00:00 foobar
Puoi anche guardare direttamente /proc/<pid>/exe
, che può essere un collegamento simbolico all'eseguibile appropriato. Nell'esempio precedente, questo fornisce informazioni molto più utili rispetto a ps
:
$ls -l /proc/9600/exe
lrwxrwxrwx. 1 lars lars 0 Feb 8 11:31 /proc/9600/exe -> /usr/bin/lftp
Soluzione 3:
per me, proprio ora, ho trovato quel pstree
ha fornito un'indicazione molto più chiara di come è stato avviato un processo rispetto a ps aux
ha questo aspetto:
├─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} ]
Soluzione 4:
puoi usare:
systemctl status <PID>
o con il nome del processo:
systemctl status $(pgrep perl)
Questo fornirà informazioni sui servizi systemd che hanno avviato il tuo processo.
Ho trovato questo suggerimento qui
Soluzione 5:
Prova ps axww | grep perl
per ottenere la riga di comando completa del processo. Sembra top
ha appena tagliato una lunga fila.