Para o Ubuntu 16.04+ usando o systemd (o padrão).
systemd-inhibit --why="Wait for this script to finish" bash script.sh
===
Teste:
$ systemctl poweroff
Operation inhibited by "bash script.sh" (PID 23912 "systemd-inhibit", user rinzwind),
reason is "Wait for this script to finish".
Please retry operation after closing inhibitors and logging out other users.
===
-
sleepinibe a suspensão do sistema e a hibernação solicitada por usuários (não privilegiados) -
shutdowninibe o desligamento do sistema de alto nível e a reinicialização solicitada por usuários (não privilegiados) -
idleinibe que o sistema entre no modo ocioso, possivelmente resultando na suspensão ou desligamento automático do sistema, dependendo da configuração. -
handle-power-keyinibe o tratamento de baixo nível (ou seja, o login interno) da chave de hardware de energia do sistema, permitindo que o código externo (possivelmente sem privilégios) manipule o evento. -
handle-suspend-keyinibe a manipulação de baixo nível da chave de suspensão de hardware do sistema. -
handle-hibernate-keyinibe a manipulação de baixo nível da chave de hibernação do hardware do sistema. -
handle-lid-switchinibe o manuseio de baixo nível do switch da tampa do hardware do systemd.
Você provavelmente também deseja evitar suspend , idle e hibernate .
Exemplo de uso de "gerenciador de pacotes" :
fd = Inhibit("shutdown:idle", "Package Manager", "Upgrade in progress...", "block");
/* ...
do your work
... */
close(fd);
Similar a isso, você pode codificar sua versão e adicionar um "desligamento" no final deste script (ou adicionar uma maneira de determinar se um desligamento precisa ser a próxima ação).