SOLUÇÃO INICIAL
Então, você tem systemd
como seu init. Nesse caso, primeiro sugiro evitar usar a camada de compatibilidade pelo menos em seu próprio código e, em vez disso, usar as ferramentas nativas do systemd. Aqui, sua melhor aposta seria usar a capacidade do systemd de executar arquivos arbitrários em /usr/lib/systemd/system-shutdown
como parte de sua lógica de desligamento.
Para citar systemd-shutdown (8) :
Immediately before executing the actual system halt/poweroff/reboot/kexec systemd-shutdown will run all executables in /usr/lib/systemd/system-shutdown/ and pass one arguments to them: either "halt", "poweroff", "reboot" or "kexec", depending on the chosen action.
Então, você pode colocar um script fazendo apenas hdparm -Y
nesse diretório, e ele será executado logo antes do sistema ser parado. Note que é desligamento muito tardio : tudo é desmontado ou remontado somente para leitura, processos são eliminados, rede está inoperante, etc, etc. Devido a isso, você não precisará de nenhuma das tarefas auxiliares. lógica atualmente presente no seu script.
UPDATE
Como você afirmou, apenas dizer ao disco para dormir não ajuda. Isso é porque é acordado novamente depois que seu script termina. Isso possivelmente acontece porque systemd-shutdown
realiza preparações finais para o desligamento, ou o que quer que seja.
Portanto, precisamos remover o dispositivo do sistema depois de enviá-lo para o modo de suspensão. Suponho que sua unidade seja um dispositivo de armazenamento em massa USB; tudo abaixo funcionará apenas para essas unidades.
DRIVE=sdb # replace with whatever is needed
echo 1 > $(realpath /sys/block/$DRIVE/device)/../../../../remove
Para entender o que está acontecendo, é necessário ter algum conhecimento de hierarquia sysfs (específica do Linux).
-
/sys/block/sdX
é um diretório que representa um dispositivo de bloco (virtual) -
device
é um link simbólico que aponta para o diretório que representa o dispositivo SCSI físico (no Linux, os dispositivos de armazenamento em massa USB são mostrados como discos SCSI) - primeiro
..
vai para o diretório pai representando um destino SCSI - segundo
..
vai para o diretório pai representando um host SCSI - terceira
..
vai para o diretório pai que representa uma "interface" USB - quarta
..
vai para o diretório pai que representa um "dispositivo" USB - é disso que precisamos.
Finalmente, escrevemos 1
no arquivo remove
desse diretório. Isso informa ao driver USB para desativar e remover o dispositivo do sistema.
Espero que isso funcione.