This is part of a series of posts on the design and technical steps of creating Himblick, a digital signage box based on the Raspberry Pi 4.
We've started implementing reloading of the media player when media on disk changes.
One challenge when doing that, is that libreoffice doesn't always stop. Try this and you will see that the presentation keeps going:
$ loimpress --nodefault --norestore --nologo --nolockcheck --show example.odp
$ pkill -TERM loimpress
It turns out that loimpress forks various processes. After killing it, these processes will still be running:
/usr/lib/libreoffice/program/oosplash --impress --nodefault --norestore --nologo --nolockcheck --show talk.odp
/usr/lib/libreoffice/program/soffice.bin --impress --nodefault --norestore --nologo --nolockcheck --show talk.odp
Is there a way to run the media players in such a way that, if needed, they can easily be killed, together with any other process they might have spawned meanwhile?
systemd-run
Yes there is: systemd provides a systemd-run command to run simple commands under systemd's supervision:
$ systemd-run --scope --slice=player --user \
loimpress --nodefault --norestore --nologo --nolockcheck --show media/talk.odp
This will run the player contained in a cgroup with a custom name, and we can simply use that name to stop all the things:
$ systemctl --user stop player.slice
Resulting python code
The result is this patch which simplifies the code, and isolates and easily kills all subprocesses run as players.