4

I need to catch any OS shut down and execute some actions before letting the OS be shutted down. I'm using Fedora 19 and C++.

I'm able to catch a shutdown signal given by the console with the following C++ code :

myAct.sa_handler = myStructure::mySignalHandler;
sigaction(mySignal, &act, NULL);

The mySignal signal can be activated via /etc/init.d and a custom code executed before a shutdown is made.

On Fedora 12 Kernel 2.6, this solutions works perfectly. The solution works on Fedora 19 Kernel 3.9.5 if I try to shut down the computer using the graphic interface.

However, I can't manage to execute my code when a command is used in a terminal to reboot or shut down the computer on Fedora 19 kernel 3.9.5 The solution doesn't work anymore since it dropped the usual init.d script system.

Putting my script on the /usr/lib/systemsd location doesn't work, the script is executed, but the other scripts are also executed. Thus, the systems shuts down not treating my commands.

How may I solve that problem?

5
  • A shutdown doesn't send a “shutdown signal”: there's no such thing. Usually shutdown sends SIGTERM, waits a little, then sends SIGKILL. What signal are you catching? Apr 23, 2014 at 21:33
  • I want to execute code before the SIGTERM signal is sent by the OS.
    – Xaltar
    Apr 24, 2014 at 7:47
  • Then you would not be getting a signal. You would need to run your code from the shutdown code invoked by systemd. I think this requires being root (it does with sysvinit and upstart, and probably does with systemd as well since otherwise a user could block a shutdown). Apr 24, 2014 at 10:24
  • That's precisely what I'm trying to do ...
    – Xaltar
    Apr 24, 2014 at 11:13

1 Answer 1

0

The signal can be caught from a running process. So, if you start a long-living process (aka daemon) on boot-up, then you will indeed receive a SIGTERM from that process and do whatever you want from the signal handler. However, this is the worst method possible: an extra process doing nothing and just waiting for a signal to arrive.

You have better ways to achieve this, esp. with systemd. The unit file (foo.service) will look as following:

[Unit]
Description=Perform my actions
DefaultDependencies=no
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/path/to/your/application

However, keep in mind that due to parallel nature of systemd this unit can be started arbitrarily late in the shutdown process (although this can be influenced by careful use of dependencies).

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .