Čau, trap jsem vyzkoušel a při ručním vypínání pomocí "kill -TERM <pid>" fungoval, ale když jsem vypl PC, tak se "exit_handler()" vůbec nespustil. Musel jsem za "TERM INT" přidat ještě HUP (nemám Ubuntu, ale zde je asi vysvětlení:
https://askubuntu.com/questions/819730/no-sigterm-before-sigkill-shutdown-with-systemd-on-ubuntu-16-04 ). Po přidání HUP se "exit_handler()" při vypínání PC skutečně spustil, bohužel "stop.sh" se nestihl dokončit (trvá několik desítek sekund).
Takže v podstatě stejný problém jako u té mé "--user" služby, tzn. stop.sh se spustí, ale během provádění mi systemD KILLne (nebo spíše HUPne) programX. Zkoušel jsem u tvého příkladu změnit
"/usr/bin/programx &" na
"nohup /usr/bin/programx & disown" (nebo i bez disown), aby programX ignoroval HUP. Bez úspěchu.
Zjistil jsem, že systemD umí vytvářet dočasné služby, takže jediné funční řešení zatím je, že uživatelé musí programX spouštět takto:
systemd-run --user -p ExecStop=/path/to/stop.sh programX
Bylo by lepší kdyby to nějak šlo bez systemd-run, aby to pro uživatele bylo jednodušší, ale jediné co mě napadá je spouštět cron, který bude kontrolovat běžící procesy a pokud najde programX, tak z něj udělá dočasnou službu, ale to už se mi zdá trochu hardcore.
PS: Ještě jsem zkoušel "systemd-inhibit programX" (
man systemd-inhibit), který by měl zablokovat vypnutí/resetování/spánek... Typickým využitím má být, zablokování vypnutí když se vypalují zálohy na DVD. Příkaz "systemd-inhibit --list" mi ukazoval, že programX tam je, ale k žádnému blokování při vypnutí nedošlo, protože programX se po signálu TERM nebo HUP asi normálně ukončil a tudíž nemohl nic blokovat, takže jsem nějak nepochopil jak to má fungovat.