web-dev-qa-db-ja.com

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

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

36
Jackzz

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

さて、私が my answer で提供した情報を使用すると、接続された制御端末なしで実行されるプロセスを検索することで、実行中のデーモンを見つけることができます。これは、psを使用して非常に簡単に行うことができます。

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

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

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

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

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

  • Rootがグラフィカルプログラムを実行している場合は、それらが表示されます。
  • Root権限なしで実行されているデーモンは動作しません。ブート時に起動するデーモンは、通常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がアタッチされていない」ルールを忘れないでください。このため、各プロセスのtty(およびその完全なコマンドライン)を出力するために、前の行に-o tty,argsを追加します。

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

最後の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 ^?
52
John WH Smith

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

良い悪魔は、/ etc/initdに適切に書かれた起動スクリプトを持っています

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

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

/ var/lock/subsys

だからあなたはできる

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

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

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

/ proc

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

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

/ proc/1234/status

それを開いて、「名前:」で始まる最初の行を取得します。

見る

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

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

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

0
Massimo