私の question から、デーモンの機能を簡単に決定できないことは明らかでした。service --status-all
コマンドを使用してすべてのデーモンを一覧表示できるさまざまな記事やフォーラムを読みました私のシステムで。ただし、Ubuntu 14.04
システムで現在実行中のデーモンであるNetworkManager
はコマンドによってリストされないため、コマンドがすべてのデーモンをリストしているとは思いません。実行中のデーモンを一覧表示するコマンドはありますか、それともfilesystem
自体からデーモンを見つける方法はありますか?
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つの問題が発生します。
基本的に、制御端末なしですべてのプログラムを表示したいが、GUIプログラムは表示したくない。幸運なことに、GUIプロセスを一覧表示するプログラムがあります:xlsclients
! slmからのこの回答 を使用してすべての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 ^?
「古い」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/
(厄介なフォーマットで申し訳ありません。携帯電話から書いています...)