How systemd stop command actually works
SystemdSystemd Problem Overview
I am using a systemd service which calls a process when it's been "started" (e.g. systemctl start test.service
). As per the design, the process stays for ever in a loop, we are able to see process existence using 'ps' command. We have also seen that the process is getting killed (as intended) for systemctl stop
command.
However our requirement is, we want to do some safe shutdown operations from within the process before it gets killed. But I am not sure how to detect a systemd stop operation from within the process.
Does a systemctl stop test.service
command send SIGKILL
or SIGTERM
signal to kill the process? How can I detect a systemctl stop
operation from within a process?
Systemd Solutions
Solution 1 - Systemd
By default, a SIGTERM
is sent, followed by 90 seconds of waiting followed by a SIGKILL
.
Killing processes with systemd
is very customizable and well-documented.
I recommend reading all of man systemd.kill as well as reading about ExecStop= in man systemd.service.
To respond to those signals, refer to the signal handling documentation for the language you are using.
Solution 2 - Systemd
> Does a systemctl stop test.service command send SIGKILL or SIGTERM signal to kill the > process? How can i detect a systemctl stop operation from within a process?
Systemd sends SIGTERM signal to process. In process you have to register signals, which are "catched".
In process, eg. SIGTERM signal can be registered like this:
void signal_callback()
{
printf("Process is going down\n");
}
signal(SIGTERM, signal_callback)
When SIGTERM is sent to process signal_callback() function is executed.