Todos os comandos no shell interativo sem login do debian9 (modo gráfico).
Eu quero fazer backup do mysql antes de reiniciar ou desligar.
who
test tty7 2018-02-01 18:26 (:0)
test@world:~$ pwd
/home/test
Agora, os três comandos a seguir podem fazer backup do banco de dados mysql.
USERNAME="xxxx"
PASSWORD="yyyy"
mysqldump -u root -p${PASSWORD} database > /home/test/wp.sql.bak
Crie um serviço em execução antes de reiniciar ou desligar.
vim /etc/systemd/system/test.service
[Unit]
Description=Run command at shutdown
Before=shutdown.target reboot.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/bash /home/test/test.sh
[Install]
WantedBy=multi-user.target
O arquivo test.sh .
cat /home/test/test.sh
USERNAME="xxxx"
PASSWORD="yyyy"
mysqldump -u root -p${PASSWORD} database > /home/test/wp.sql.bak
Habilite o serviço.
sudo systemctl enable test.service
sudo reboot
Agora faça login no shell interativo sem login (modo gráfico).
sudo systemctl enable test.service
-- Logs begin at Thu 2018-02-01 18:26:04 HKT, end at Thu 2018-02-01 18:27:23 HKT. --
Feb 01 18:26:13 world systemd[1]: Starting Run command at shutdown...
Feb 01 18:26:18 world bash[480]: mysqldump: Got error: 2002: "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")"
Feb 01 18:26:19 world systemd[1]: test.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Feb 01 18:26:19 world systemd[1]: Failed to start Run command at shutdown.
Feb 01 18:26:19 world systemd[1]: test.service: Unit entered failed state.
Feb 01 18:26:19 world systemd[1]: test.service: Failed with result 'exit-code'
Os três comandos podem ser executados no terminal em vez de conter em test.service, como escrever um serviço de backup de todos os bancos de dados mysql ao reiniciar ou desligar?
Primeiro, use
ExecStop=/bin/bash /home/test/test.sh
em vez deExecStart
. Consulte Como executar um script com systemd logo antes do desligamento? Para maiores informações. Você parece estar executando seu script na inicialização, presumivelmente antes do mysql ser totalmente iniciado.Em segundo lugar, considere adicionar
After=mariadb.service
para garantir que o script seja executado antes que o mysql seja encerrado. Lembre-se que, ao considerar a ordem de desligamento, tudo está ao contrário.É mariadb em debian9 em vez de mysql.