守护程序的概念附加到进程,而不是文件。因此,“在文件系统上查找守护程序”毫无意义。只是为了使这个概念更加清楚:程序是一个可执行文件(在的输出中可见ls
); 进程是该程序的实例(在的输出中可见ps
)。
现在,如果使用我在回答中提供的信息,则可以通过搜索未连接控制终端的进程来找到正在运行的守护程序。可以很容易地做到这一点ps
:
$ ps -eo 'tty,pid,comm' | grep ^?
该tty
输出字段包含“?” 当进程没有控制终端时。
当您的系统运行图形环境时,就会出现一个大问题。由于GUI程序(即Chromium)未附加到终端,因此它们也会出现在输出中。在root不运行图形程序的标准系统上,您可以简单地将前一个列表限制为root的进程。这可以通过使用ps
' -U
开关来实现。
$ ps -U0 -o 'tty,pid,comm' | grep ^?
但是,这里出现两个问题:
- 如果root正在运行图形程序,则将显示它们。
- 没有root特权的守护程序将不会运行。请注意,启动时启动的守护程序通常以root身份运行。
基本上,我们想显示所有没有控制终端的程序,而不是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”规则。为此,我将添加-o tty,args
到上一行,以便输出tty
每个进程(及其完整的命令行):
$ 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 ^?
network-manager
不是NetworkManager
。