La nozione di demone è collegata ai processi , non ai file . Per questo motivo, non ha senso "trovare demoni sul filesystem". Giusto per rendere un po 'più chiaro il concetto: un programma è un file eseguibile (visibile nell'output di ls
); un processo è un'istanza di quel programma (visibile nell'output di ps
).
Ora, se usiamo le informazioni che ho dato nella mia risposta , potremmo trovare demoni in esecuzione cercando processi che girano senza un terminale di controllo ad essi collegato . Questo può essere fatto abbastanza facilmente con ps
:
$ ps -eo 'tty,pid,comm' | grep ^?
Il tty
campo di output contiene "?" quando il processo non ha un terminale di controllo.
Il grosso problema qui arriva quando il tuo sistema esegue un ambiente grafico. Poiché i programmi GUI (ad es. Chromium) non sono collegati a un terminale, appaiono anche nell'output. Su un sistema standard, in cui root non esegue programmi grafici, è possibile semplicemente limitare l'elenco precedente ai processi di root. Questo può essere ottenuto usando ps
' -U
switch.
$ ps -U0 -o 'tty,pid,comm' | grep ^?
Tuttavia, qui sorgono due problemi:
- Se root esegue programmi grafici, verranno visualizzati.
- I demoni che funzionano senza i privilegi di root non lo faranno. Nota che i demoni che iniziano all'avvio di solito sono in esecuzione come root.
Fondamentalmente, vorremmo visualizzare tutti i programmi senza un terminale di controllo, ma non i programmi GUI . Fortunatamente per noi, non v'è un programma per i processi lista GUI: xlsclients
! Questa risposta di slm ci dice come usarla per elencare tutti i programmi della GUI, ma dovremo invertirla, poiché vogliamo escluderli. Questo può essere fatto usando l' --deselect
interruttore.
Innanzitutto, creeremo un elenco di tutti i programmi della GUI per i quali abbiamo processi in esecuzione. Dalla risposta che ho appena collegato, questo viene fatto usando ...
$ xlsclients | cut -d' ' -f3 | paste - -s -d ','
Ora, ps
ha un -C
interruttore che ci consente di selezionare il nome del comando. Abbiamo appena ricevuto il nostro elenco di comandi, quindi inseriamolo nella ps
riga di comando. Si noti che sto usando in --deselect
seguito per invertire la mia selezione.
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect
Ora, abbiamo un elenco di tutti i processi non GUI. Non dimentichiamo la nostra regola "nessun allegato TTY". Per questo, aggiungerò -o tty,args
alla riga precedente per generare l'output tty
di ciascun processo (e la sua riga di comando completa):
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?
Il finale grep
cattura tutte le linee che iniziano con "?", Cioè tutti i processi senza controllo tty. E il gioco è fatto! Questa riga finale fornisce tutti i processi non GUI in esecuzione senza un terminale di controllo. Nota che potresti ancora migliorarlo, ad esempio, escludendo i thread del kernel (che non sono processi) ...
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?
... o aggiungendo alcune colonne di informazioni che puoi leggere:
$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?
network-manager
noNetworkManager
.