>I've been trying to find out why my "finish" script is not working
>(or perhaps it is working but not printing output anywhere I can see)
The ways of shutdown are mysterious. :)
>However, I don't think kill(-1, n) *works* for pid 1.
Indeed, it does not. That kill is supposed to be sent to every process
*except* s6-svscan, which will survive and restart the supervisor for
s6-linux-init-shutdownd, which will restart s6-linux-init-shutdownd,
which will then execute stage 4.
If you're not in a container, stage 4 will unmount the filesystems
then hard halt/poweroff/reboot the machine.
https://git.skarnet.org/cgi-bin/cgit.cgi/s6-linux-init/tree/src/shutdown/s6-linux-init-shutdownd.c#n193
s6-linux-init-shutdownd never tells s6-svscan to exit, so if you're
running s6-linux-init, it's normal that your .s6-svscan/finish script
is not executed.
The place where you want to hack things is /etc/rc.shutdown.final,
which is run by the stage 4 script right before the hard reboot. At
this point nothing is mounted anymore and the process tree is only
s6-svscan
\_ s6-supervise s6-linux-init-shutdownd
\_ foreground { rc.shutdown.final } reboot
\_ rc.shutdown.final
so you can do dirty stuff like "rm -f
/run/service/s6-linux-init-shutdownd
&& s6-svc -dxwD /run/service/s6-linux-init-shutdownd &&
s6-svscanctl -b /run/service" which should clean up the s6-supervise
and the foreground, and give control to .s6-svscan/finish.
Start your finish script with "wait { }" because s6-svscan will
probably
exec into it before rc.shutdown.final dies, and you don't want a zombie
hanging around.
--
Laurent
Received on Tue Nov 21 2023 - 01:28:23 CET