GNU/Linux >> Linux Esercitazione >  >> Linux

Come può sembrare che un processo abbia un nome diverso nell'output di ps?

La manipolazione del nome nell'elenco dei processi è una pratica comune. Per esempio. Nel mio processo ho elencato quanto segue:

root      9847  0.0  0.0  42216  1560 ?        Ss   Aug13   8:27 /usr/sbin/dovecot -c /etc/dovecot/d
root     20186  0.0  0.0  78880  2672 ?        S    Aug13   2:44  \_ dovecot-auth
dovecot  13371  0.0  0.0  39440  2208 ?        S    Oct09   0:00  \_ pop3-login
dovecot   9698  0.0  0.0  39452  2640 ?        S    Nov07   0:00  \_ imap-login
ericb     9026  0.0  0.0  48196  7496 ?        S    Nov11   0:00  \_ imap [ericb 192.168.170.186]

Dovecot utilizza questo meccanismo per mostrare facilmente cosa sta facendo ogni processo.

Fondamentalmente è semplice come manipolare il argv[0] parametro in C. argv è un array di puntatori ai parametri con cui il processo è stato avviato. Quindi un comando ls -l /some/directory avrà:

argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null

Allocando un po' di memoria, mettendo del testo in quella memoria, e poi mettendo l'indirizzo di quella memoria in argv[0] il nome del processo mostrato sarà stato modificato con il nuovo testo.


La modifica di argv[] non è portabile. Su Linux non puoi semplicemente cambiare argv[0] in modo che punti a una stringa più lunga. Dovresti sovrascrivere gli argomenti esistenti e fare attenzione a non sovrascrivere le variabili di ambiente che seguono nello spazio degli indirizzi.

libbsd fornisce un'implementazione di setproctitle(3) per Linux che lo rende molto più semplice.


Esistono due modi standard di Linux per farlo, uno dei quali proviene da glibc e potrebbe essere portabile su altri sistemi non Linux:

  • glibc pthread_setname_np() è probabilmente il metodo migliore
  • Linux prctl() funziona anche

È possibile che la modifica di argv[0] funzionava, ma almeno sul mio attuale sistema Linux non fa nulla all'output in ps .

Vedi questa risposta per maggiori dettagli e un esempio di codice:https://stackoverflow.com/a/55584492/737303


Linux
  1. Come fare in modo che "data" produca l'ora da un fuso orario diverso?

  2. Come ottenere solo l'ID del processo nello specificare il nome del processo in Linux?

  3. Come posso fare in modo che tcpdump scriva su file e emetta in output standard i dati appropriati?

  4. Come identificare la porta di un processo?

  5. Come ordinare l'output di ps in base all'ora di inizio del processo?

Come trovare un nome di processo utilizzando il numero PID in Linux

Come trovare il nome del processo dal suo PID

Se conosco il numero PID di un processo, come posso ottenere il suo nome?

Un processo può avere un proprietario? Cosa significa?

Come posso ordinare du -h output per dimensione

lsof - limita l'output solo ai file fisici - come?