実行中のすべてのデーモンをリストする方法は?


32

私の質問から、デーモンの機能を簡単に決定できないことは明らかでした。さまざまな記事やさまざまなフォーラムで、service --status-allコマンドを使用してシステム内のすべてのデーモンを一覧表示できます。しかしNetworkManager、私のUbuntu 14.04システムで現在実行されているデーモンはコマンドによってリストされていないため、コマンドがすべてのデーモンをリストしているとは思いません。実行中のデーモンをリストするコマンドがありますか、それともそれfilesystem自体からデーモンを見つける方法がありますか?


リストされていませんか?どうやってチェックしていますか?Debianで見ることができます。名前はnetwork-managerであることに注意してくださいNetworkManager
テルドン

はい。確信してます。ネットワークという用語に関連するものはリストされていません。またanacron、initスクリプトでデーモンではないものとして記載されているものもリストします。
Jackzz 14

デーモンではないアナクロンは、常に実行されるわけではないため、セマンティクスの問題です。通常はデーモンと呼ばれるサービスとして実行されます。質問を編集してください。i)実行しているUbuntuを教えてください。ii)「デーモン」の正確な意味を教えてください。ここでの最終目標は何ですか?
テルドン

バックグラウンドで実行されているサービスはすべてデーモンであると思います。デーモンではないanacronと言われたので言及しました/etc/init.d/anacron。私の目的はC++、システムで実行されているすべてのデーモンをリストするプログラムを作成することです。そのためには、詳細を取得するために解析するファイルを知る必要があります。
Jackzz 14

1
さて、デーモンをサービスとして定義する場合service --status-allは、必要なものです。UbuntuはNetworkManagerを異なるように扱うようです。Debian とUbuntuの両方networkingnetwork-manager出力さservices --status-allれますnetworking。「デーモン」の意味を正確に定義する必要があると思います。
テルドン

回答:


52

デーモンの概念は、ファイルではなくプロセスに関連付けられています。このため、「ファイルシステム上のデーモンを見つける」ことには意味がありません。概念を少し明確にするために、プログラムは実行可能ファイル(の出力に表示されるls)です。プロセスはそのプログラムのインスタンスです(の出力に表示されますps)。

さて、回答で与えた情報を使用すると、制御端末が接続されていない状態で実行されるプロセスを検索することで、実行中のデーモンを見つけることができます。これは非常に簡単にできますps

$ ps -eo 'tty,pid,comm' | grep ^?

tty出力フィールドが含まれています「?」プロセスに制御端末がない場合。

ここでの大きな問題は、システムがグラフィカル環境を実行するときに発生します。GUIプログラム(つまりChromium)は端末に接続されていないため、出力にも表示されます。rootがグラフィカルプログラムを実行しない標準システムでは、単に以前のリストをrootのプロセスに制限できます。これはps' -Uスイッチを使用して実現できます。

$ ps -U0 -o 'tty,pid,comm' | grep ^?

ただし、ここでは2つの問題が発生します。

  • rootがグラフィカルプログラムを実行している場合、表示されます。
  • ルート権限なしで実行されているデーモンはそうしません。通常、ブート時に起動するデーモンはルートとして実行されます。

基本的に、GUI端末ではなく、制御端末なしですべてのプログラム表示します。幸いなことに、GUIプロセスをリストするプログラムがありますxlsclientsslmからのこの回答は、すべてのGUIプログラムをリストするためにそれを使用する方法を示していますが、それらを除外したいので、逆にする必要があります。これは、--deselectスイッチを使用して実行できます。

最初に、実行中のプロセスがあるすべてのGUIプログラムのリストを作成します。私がリンクした答えから、これは以下を使用して行われます...

$ xlsclients | cut -d' ' -f3 | paste - -s -d ','

今、ps持っている-C私たちは、コマンド名で選択できるようにするスイッチを。コマンドリストを取得したので、psコマンドラインに挿入します。--deselect選択を逆にするために後で使用していることに注意してください。

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect

これで、すべての非GUIプロセスのリストができました。「TTY接続なし」ルールを忘れないでください。この-o tty,argsためtty、各プロセス(およびその完全なコマンドライン)を出力するために、前の行に追加します。

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?

final grepは、「?」で始まるすべての行、つまり制御ttyのないすべてのプロセスをキャプチャします。そして、あなたはそこに行きます!この最後の行は、制御端末なしで実行されているすべての非GUIプロセスを提供します。たとえば、カーネルスレッド(プロセスではない)を除外することで、さらに改善できることに注意してください。

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?

...または読むための情報のいくつかの列を追加することにより:

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?

Linuxは、仮想ファイルシステムprocfsに関する多くの情報を保持しています。だから、「ファイルシステム上のデーモンを見つける」ことが可能です!!!
マッシモ

0

「古い」sysv initdについて書いたので、ディストリビューションで動作しているかどうかを確認する必要があります。

良い悪魔は/ etc / initdに起動スクリプトをよく書いています

ランレベルを変更するとき、initは実行中のデーモンをどのように認識しますか?

ディレクトリで名前を探します

/ var / lock / subsys

だからあなたはできる

そこから名前リストを取得する

実行中のすべてのプロセスをスキャンし、名前がリスト内にあるかどうかを確認します:bingo!

すべてのプロセスをスキャンするには:すべてのサブディレクトリをリストします

/ proc

名前が数字の場合、実行中のプロセスのPIDです。

たとえば、pid 1234のプロセスのステータスはこのファイルです

/ proc / 1234 / status

それを開いて最初の行を取得し、「Name:」で始まります

見る

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

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

(厄介なフォーマットについては申し訳ありませんが、携帯電話から書いています...)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.