There is a lot of solution here to execute a script at shutdown/reboot, but I want my script to only execute at shutdown.

I've tried to put my script in /usr/lib/systemd/systemd-shutdown, and check the $1 parameter, as seen here, but it doesn't work.

Any ideas ?

system : archlinux with gnome-shell

$systemctl --version                                                                                                                                                                                 
systemd 229
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
share|improve this question
    
I don't think this will be the solution, but you should put custom scripts into /etc/systemd/system/. The /usr/lib/systemd/system/ directory is meant to be used for system-provided scripts. – ILMostro_7 May 21 '16 at 9:27
up vote 4 down vote accepted

I've finally found how to do that.

It's a bit hackish thought, but it works.

I've used some part of this thread : https://stackoverflow.com/questions/25166085/how-can-a-systemd-controlled-service-distinguish-between-shutdown-and-reboot

and this thread : How to run a script with systemd right before shutdown?

I've created this service /etc/systemd/system/shutdown_screen.service

[Unit]
Description=runs only upon shutdown
Conflicts=reboot.target
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/bin/bash /usr/local/bin/shutdown_screen
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Which will be executed at shudown/reboot/halt/whatever. (don't forget to enable it)

And in my script /usr/local/bin/shutdown_screen I put the following :

#!/bin/bash
# send a shutdown message only at shutdown (not at reboot)    
/usr/bin/systemctl list-jobs | egrep -q 'reboot.target.*start' || echo "shutdown" | nc 192.168.0.180 4243 -w 1

Which will send a shutdown message to my arduino, whom will shutdown my screen.

share|improve this answer

According to the systemd.special man-page, you should use Before=poweroff.target.

poweroff.target

A special target unit for shutting down and powering off the system.

Applications wanting to power off the system should start this unit.

runlevel0.target is an alias for this target unit, for compatibility with SysV.

Additionally, as I mentioned in my comment, you should put custom scripts into /etc/systemd/system/. The /usr/lib/systemd/system/ directory is meant to be used for system-provided scripts.

So, maybe something like this:

[Unit]
Description=runs only upon shutdown
DefaultDependencies=no
Conflicts=reboot.target
Before=shutdown.target
Requires=poweroff.target

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/usr/local/bin/yourscript
RemainAfterExit=yes
share|improve this answer
    
Well, it doesn't seems to work. I've edited your .service like this (otherwise, symlink aren't created) http://pastebin.com/dq01rQVM But nothing is executed at shutdown. I forgot to said that I need a working connection for my script. But I've tried with a echo "test" > /root and nothing was created. – benoit2600 May 21 '16 at 12:42

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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