Linux: Working With Daemons📄 BetterWays.dev wiki page | 🕑 Last updated: Apr 3, 2022
To put it very simply, a daemon is a service process that runs in the background.
Working with daemons on Linux can be tricky for new users - because of the historical baggage and backward compatibility, there are now many ways to do the same thing.
Just a bit of background first: after the boot loader loads the kernel and everything is initialized, the final step is starting the
init process. This process is also called the root process and it has PID 1 (PID 0 is part of the kernel - the so-called
These days, you're most likely using a Linux distribution that is running
systemd as PID 1.
To control the services under systemd, you're mostly going to use
Checking the status of the service:
systemctl status myservice.service
Starting and stopping the service:
systemctl start myservice.service systemctl stop myservice.service systemctl restart myservice.service
Enabling and disabling the service (on every boot):
systemctl enable myservice.service systemctl disable myservice.service
Adding a new service
To add a new service, you just need to put the Unit file in /etc/systemd/system/ directory.
A minimal /etc/systemd/system/myservice.service could look something like this:
[Unit] Description=My Awesome Service [Service] # Simple service won't do any forking Type=simple ExecStart=/path/to/command [Install] # Start the service before we get to multi-user mode WantedBy=multi-user.target
Now we just need to do the "daemon-reload" (to tell systemd to pick up our new file):
And enable and start our service:
systemctl enable myservice.service systemctl start myservice.service systemctl status myservice.service
systemd is a relatively new addition to Linux. Traditionally, Linux systems have been using SysVInit as an init subsystem. It's much simpler than
systemd (closer to the original Unix philosophy), and this whole switching thing had brought a lot of controversy to the Linux community. There are still actively maintained distributions that are using SysVInit.
Also, there is still a lot of software and documentation which are using these commands.
"Services" under SysVInit are just scripts inside /etc/init.d/ directory which are responding to arguments like start, stop, restart, etc.
This was the original SysVInit of starting and stopping the service:
/etc/init.d/myservice start /etc/init.d/myservice stop /etc/init.d/myservice restart
service command was added (which was mostly equivalent to the above, but not always):
service myservice start service myservice stop service myservice restart
(these commands are backwards compatible - it should work the same as using
systemctl on your systemd-based system)
Adding the service to default runlevels (enabling it on every boot):
# Debian-based distros update-rc.d myservice defaults # Redhat-based distros chkconfig myservice on
Upstart was an event-based replacement for SysVInit created by Canonical, but today is not used anymore.
If you somehow run into the system that is still using it, you can mostly use the same, above-mentioned commands for SysVInit.