Linux: come sapere dove è stato avviato un processo e come è stato avviato?


34

Stavo controllando una scatola di Linux e ho trovato un processo perl in esecuzione e prendendo una buona parte dell'utilizzo della CPU. Con la cima, ho potuto solo perl nel nome del processo.

Quando ho premuto c , per visualizzare la riga di comando, mostrava / var / spool / mail. Il che non ha senso, poiché questa è directory.

Le mie domande sono:

1) Perché è successo? In che modo questo processo perl potrebbe mascherare la sua riga di comando? 2) Qual è il modo più affidabile per scoprire dove e come è stato avviato un processo?

Grazie!

Risposte:


36

Nella maggior parte dei casi psè sufficiente solo correre , insieme ai flag preferiti per consentire un output ampio. Mi protendo verso ps -feww, ma gli altri suggerimenti qui funzioneranno. Nota che se un programma è stato avviato da qualcuno $PATH, 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 pspossono essere completamente sovrascritte 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 link simbolico all'eseguibile appropriato. Nell'esempio sopra, questo ti dà molte più informazioni utili di ps:

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

1
tutto sommato, i file in /procforniranno tutte le informazioni su un programma, exesaranno un link all'eseguibile, cwdalla directory di lavoro corrente, la fddirectory contiene collegamenti a file aperti (inclusi input standard, output ed errore standard)
Hubert Kario

57

Il modo più affidabile è guardare la /procdirectory per il processo. Ogni processo ha una /proc/<pid>/directory in cui conserva informazioni come:

  1. cwd collegamento alla directory di lavoro corrente
  2. fd una directory con collegamenti ai file aperti (descrittori di file)
  3. cmdline leggilo per vedere quale riga di comando è stata utilizzata per avviare il processo
  4. environ le variabili d'ambiente per quel processo
  5. root un collegamento a ciò che il processo considera root dir (sarà / a meno che non sia chroot)

Ci sono più informazioni interessanti su ogni processo / proc, ma con quelli sopra sarai in grado di sapere esattamente cosa sta succedendo.

Inoltre, usando ps auxfti mostrerà chi ha biforcato cosa, così potresti avere un'idea migliore di chi sta chiamando il tuo perl.


Uso sempre Process Explorer su Windows e mi chiedevo se ci fosse un equivalente su Linux. Questo interruttore fa tutto! ps auxf ... bello!
Yanick Girouard,

1
+1 per il parametro f per ps, è stato per me!
Lennart Rolland,

2
+1 per avermi insegnato quello che sembra un concetto così fondamentale ... /proccontiene informazioni di processo! chi lo sapeva?? tutto ciò che io abbia mai cercato lì era versioned cpuinfoe roba del genere ... inoltre questo risolve il mio vero problema perché la versione di ps del mio router ignora tutti i parametri
Nacht - Reinstate Monica

@coredump: e se il processo chiamato chroot()prima, come posso sapere a quale directory /proc/ᴘɪᴅ/cwdcorrisponde?
user2284570

10

per me, proprio ora, ho scoperto che ha pstreedato un'indicazione molto più chiara di come è stato avviato un processo, rispetto aps aux

sembra così:

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

2

Cerca ps axww | grep perldi ottenere l'intera riga di comando del tuo processo. Sembra che abbia topappena tagliato una linea lunga.


2

Prova a usare il comando fuser -vu /var/spool/mail Questo comando ti mostrerà i PID dei processi usando i file o i file system specificati. Nella modalità di visualizzazione predefinita, ogni nome di file è seguito da una lettera che indica il tipo di accesso:

c - directory corrente. e - eseguibile in esecuzione. f - apre il file. f viene omesso nella modalità di visualizzazione predefinita. r - directory principale. m - mmap'ed file o libreria condivisa.

Forse ti aiuterà ad andare avanti nella tua ricerca per rispondere alla tua ricerca. Non so se ti aiuta, ma forse scoprirai alcune informazioni utili.


1

Senza consultare la pagina man per i flag esatti, un modo semplice per finanziare quale sia la riga di comando e l'ora di inizio, ps auxwww dovrebbe funzionare. Puoi renderlo più elegante se lo desideri leggendo la pagina man.


1

Mi vengono in mente due comandi:

1) ottenere l'ora di inizio del processo da ' ps '.

$ ps -ax -o pid,start,comm
  PID  STARTED COMMAND         USER
    1   Feb 06 init            root
    2   Feb 06 kthreadd        root
[...]
  13147 19:09:48 chrome          hcooper
  13270 19:13:51 chrome          hcooper
  13386 19:18:34 bash            hcooper

2) lastcomm , che ora controllo, non ho installato. Comunque la descrizione della pagina man dice:

   lastcomm prints out information about previously executed commands. If
   no arguments are specified, lastcomm will print info about all of the
   commands in acct (the record file).

Ma come hanno detto alcune persone, "ls -al / proc /" ti dirà molto!


0

Puoi usare:

systemctl status <PID>

o con il nome del processo:

systemctl status $(pgrep perl)

Ciò fornirà informazioni sui servizi di sistema che hanno avviato il processo.

Ho trovato questo suggerimento qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.