如何快速找出谁控制着某个 Linux 服务?
我厌倦了在 /etc 中查找 initd、upstart、systemd 或supervisord 是否正在控制某些服务。
答案1
如果您不确定哪个 init,您可以从 猜测ps | grep -E "systemd|upstart"
。 (一些闪亮的 systemd 可能存在于传统的新贵系统上,但我认为反之则不然)。您也可以检查supervisord 等。
谷歌搜索 initd 告诉我,/etc/init.d
所以我认为这就是你的意思......抱歉,但没有想到检测 sysV init-scripts其他而不是查看 /etc。 (如果你被 sysvinit 困住了,我猜你此外想要/etc/init.d/foo status
或service foo status
,以确保您的服务实际上是从 sysvinit 运行的。这不会告诉您该服务是否已不幸运行两个都sysvinit 和supervisord)。
在新贵上,我认为很容易找到工作,因为initctl list
显示了 pid。因此,如果它存在,那么它要么是一个新贵作业,要么是在向后兼容性下运行的 sysV 初始化脚本(请参阅上文以检测差异)。
在 systemd 上,您可以使用以下命令检查给定的 pidps的cgroups字段, 见下文。如果 cgroup 表明.service
它一定是由 systemd 启动的。如果您不介意寻找一个(可能不明确的)过程姓名相反,systemd-cgls
更容易记住。然后我认为systemctl status foo
甚至会给你足够的信息来检测 foo.service 的 sysV init-script 。
$ ps xawf -eo pid,user,cgroup,args PID USER CGROUP COMMAND 2 root - [kthreadd] 3 root - \_ [ksoftirqd/0] [...] 4281 root - \_ [flush-8:0] 1 root name=systemd:/systemd-1 /sbin/init 455 root name=systemd:/systemd-1/sysinit.service /sbin/udevd -d 28188 root name=systemd:/systemd-1/sysinit.service \_ /sbin/udevd -d 28191 root name=systemd:/systemd-1/sysinit.service \_ /sbin/udevd -d 1096 dbus name=systemd:/systemd-1/dbus.service /bin/dbus-daemon --system --address=systemd: --nofork --systemd-activation [...]
供监督使用supervisord status
。