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 ttycampo 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' -Uswitch.
$ 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' --deselectinterruttore.
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, psha un -Cinterruttore che ci consente di selezionare il nome del comando. Abbiamo appena ricevuto il nostro elenco di comandi, quindi inseriamolo nella psriga di comando. Si noti che sto usando in --deselectseguito 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,argsalla riga precedente per generare l'output ttydi 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 grepcattura 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-managernoNetworkManager.