Este é um trabalho muito adequado para systemd
.
Executando um script como um serviço systemd
Se o seu sistema estiver executando systemd , você poderá configurar seu script para ser executado como um serviço systemd que fornece controle sobre o ciclo de vida e o ambiente de execução, bem como condições prévias para iniciar o script, como a rede em funcionamento.
Crie seu arquivo de unidade do systemd em /lib/systemd/system
, por exemplo com vim /lib/systemd/system/autossh.service
:
[Unit]
# By default 'simple' is used, see also https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
# Type=simple|forking|oneshot|dbus|notify|idle
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target
[Service]
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=pkill -9 autossh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody
# Useful during debugging; remove it once the service is working
StandardOutput=console
[Install]
WantedBy=multi-user.target
Agora você pode testar o serviço:
systemctl start autossh
Verificando o status do serviço:
systemctl status autossh
Parando o serviço:
systemctl stop autossh
Depois de verificar se o serviço funciona como esperado, ative-o com:
systemctl enable autossh
NOTE: For security purposes systemd
will run the script in a restricted environment, similar to how crontab
scripts are run, therefore don't make any assumptions about pre-existing system variables such as $PATH. Use the Environment
keys if your script needs specific variables to be defined. Adding set -x
at the top of your bash script and then running systemctl status my_service
might help identify why your script is failing. As a rule of tumb, always use absolute paths for everything including echo
, or explicitly define your $PATH.