Come elencare tutti i demoni in esecuzione?


32

Dalla mia domanda , era chiaro che non posso facilmente decidere le funzionalità di un demone. Ho letto in diversi articoli e da diversi forum quel service --status-allcomando può essere usato per elencare tutti i demoni nel mio sistema. Ma non penso che il comando stia elencando tutti i demoni perché NetworkManager, un demone che è attualmente in esecuzione nel mio Ubuntu 14.04sistema, non è elencato dal comando. C'è qualche comando per elencare i demoni in esecuzione o c'è un modo per trovare i demoni da filesystemse stesso?


Sei sicuro che non sia elencato? Come stai controllando? Posso vederlo sul mio Debian. Si noti che il nome è network-managerno NetworkManager.
terdon

Sì. Sono sicuro. Non viene elencato nulla di correlato al termine rete. Inoltre elenca ciò anacronche è menzionato come non un demone nel suo script init.
Jackzz,

Anacron non essere un demone è più una questione di semantica perché non viene eseguito costantemente. È ancora gestito come un servizio che è ciò che normalmente si chiama demoni. Si prega di modificare la tua domanda e io) ci che Ubuntu si esegue raccontare e ii) che cosa esattamente si intende per "daemon". Qual è il tuo obiettivo finale qui?
terdon

Suppongo che qualsiasi servizio in esecuzione in background sia un demone. Ho detto anacronperché è stato detto /etc/init.d/anacronche non è un demone. Il mio obiettivo è scrivere un C++programma per elencare tutti i demoni in esecuzione nel mio sistema. Per questo ho bisogno di sapere quali file analizzare per ottenere i dettagli.
Jackzz,

1
Bene, se definisci i demoni come servizi, service --status-allè quello che ti serve. Ubuntu sembra trattare NetworkManager in modo diverso. Ottengo entrambi networkinge network-managernell'output di services --status-allsu Debian ma solo networkingsu Ubuntu. Penso che tu debba definire cosa intendi esattamente per "demone".
terdon

Risposte:


52

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 ^?

Linux mantiene molte informazioni su un filesystem virtuale, procfs. quindi è possibile "trovare demoni sul filesystem" !!!
Massimo

0

Ho scritto per il "vecchio" init sysv, devi verificare se funziona sulla tua distribuzione.

I buoni demoni hanno script di avvio ben scritti in / etc / initd

Quando si cambia runlevel, come fa init a conoscere i demoni in esecuzione?

Cerca i loro nomi nella directory

/ var / lock / subsys

Così puoi

ottenere l'elenco dei nomi da lì

scansiona tutti i processi in esecuzione e controlla se il nome è all'interno dell'elenco: bingo!

Per scansionare tutti i processi: elencare ogni sottodirectory in

/ proc

Se il suo nome è cifre, è il pid di un processo in esecuzione.

Ad esempio, lo stato del processo con pid 1234 è questo file

/ Proc / 1234 / Stato

Aprilo e ottieni la prima riga, inizia con "Nome:"

Vedere

http://man7.org/linux/man-pages/man5/proc.5.html

https://linuxexplore.com/2014/03/19/use-of-subsystem-lock-files-in-init-script/

(scusate per la cattiva formattazione, sto scrivendo dal mio cellulare ...)

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.