A falta do seu [Unit]
é a linha mágica:
Conflicts=reboot.target
Isso deve fazer com que seu script de parada seja chamado antes que o serviço de reinicialização possa ser iniciado e a rede falhe.
Meu sistema tem certos arquivos que eu preciso transferir usando o scp enquanto um nó está sendo desligado.
Eu tenho um arquivo de serviço systemd que se parece com isso.
[Unit]
Description=My Transfer Service
After=multi-user.target sockets.target network.target auditd.service \
timers.target sshd.socket [email protected] systemd-user-sessions.service \
[email protected] system-sysctl.service paths.target swap.target \
network-online.target
[Service]
Type=oneshot
ExecStart=/bin/echo "My Transfer Service"
ExecStop=/custom/dir/transfer.bash
RemainAfterExit=yes
TimeoutStopSec=0
[Install]
WantedBy=default.target timers.target
O script de transferência é semelhante a este
#!/bin/bash
scp -r /important/dir otheruser@target_node:~/
if [ "$?" != "0" ]
then
echo "ERROR 'date': Failure to transfer" >> transfer_log
exit 1
fi
echo "SUCCESS 'date'" >> transfer_log
As chaves ssh estão configuradas corretamente entre o usuário root do * este * sistema e o "outro_usuário" do outro sistema. Este scp não requer uma senha.
A transferência é bem-sucedida se eu executar o script como usuário root.
A transferência também será bem sucedida se eu usar o comando systemctl stop my-transfer
A transferência falhará quando eu chamar reboot
. Quando eu entro de volta, vejo mensagens de erro no meu log.
Como posso usar o systemd para arquivos scp durante um desligamento? (Esta é uma distro RedHat)
Editar:
O erro que o scp me dá é
ssh_exchange_identification: Connection closed by remote host
lost connection
Minha saída serial até o serviço de transferência parar
Stopping Load/Save Random Seed...
Stopping Load/Save Screen Backlight...ness of backlight:acpi_video0...
[ OK ] Stopped target System Time Synchr[ OK ] Stopped Session c5 of user r.
Stopping My-Transfer Service...
[ OK ] Stopped Network Time Synchroni[ OK ] Stopped Serial Getty on ttyS0.
[ OK ] Stopped Load/Save Random Seed.
[ OK ] Stopped Load/Save Screen Backlight ...htness of backlight:acpi_video0.
[ OK ] Stopped My-Transfer Service.
Atualizar
A transferência é bem-sucedida no desligamento se um comando cp
regular for usado. Isso não resolve o meu problema, mas prova que o erro está definitivamente relacionado ao scp de alguma forma.
O comando systemctl status my-transfer-service
mostra que meu serviço está ativo (saiu) . O script transfer.bash
também é geralmente executado por crond em vários intervalos durante a operação do sistema. Será que o cron também está tentando executar suas tarefas no desligamento?
A falta do seu [Unit]
é a linha mágica:
Conflicts=reboot.target
Isso deve fazer com que seu script de parada seja chamado antes que o serviço de reinicialização possa ser iniciado e a rede falhe.
Vou postar isso como uma resposta, já que é o que eu fiz, e descobri que é muito mais fácil do que tentar empurrar todos os processos do sistema que eu encontrei.
Eu criei um script especial de desligamento para executar as ações antes de executar a reinicialização ou o desligamento. Aliasizei o desligamento para sudo /my/special/script.sh
e segui um padrão semelhante para reinicialização, além do aliasing alias sudo = 'sudo '
. Eu também tive que adicionar este script aos arquivos sudoers para os usuários apropriados.