1

How do I quickly find out who controls some linux service?

I'm tired of poking around /etc to find out if initd, upstart, systemd or supervisord is controlling some service.

1
  • When you find yourself doing the same task repeatedly on a computer, write a program (shell script) to do it for you. And yes, the profusion of service managers is obnoxious but I don't see it getting better anytime soon.
    – msw
    Jan 30, 2015 at 23:17

1 Answer 1

3

If you're not sure which init, you can guess from ps | grep -E "systemd|upstart". (Some shiny systemd may be present on legacy upstart systems, but not vice-versa I think). You can check for supervisord or so as well.

Googling initd tells me about /etc/init.d so I assume that's what you meant... Sorry but nothing comes to mind for detecting sysV init-scripts other than looking in /etc. (If you're stuck on sysvinit I guess you additionally want to /etc/init.d/foo status or service foo status, to make sure your service is actually being run from sysvinit. That won't tell you if the service has unfortunately been run from both sysvinit and supervisord).

On upstart I think it's easy to find jobs because initctl list shows pids. So if it's there, it's either an upstart job or sysV init-script running under backwards compatibility (and see above to detect the difference).

On systemd you could check for a given pid using cgroups field of ps, see below. If the cgroup says .service it must have been started by systemd. If you don't mind looking for a (potentially ambiguous) process name instead, systemd-cgls is easier to remember. Then I think systemctl status foo will even give you enough information to detect sysV init-script for foo.service.

$ 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
[...]

For supervisord use supervisord status.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.