Introdução
Sua pergunta original diz respeito a como você pode obter mais resultados do systemd. Dê uma olhada em Como depurar a unidade do sistema ExecStart
Mas vamos ver se não podemos fazer seu serviço funcionar primeiro.
Sobre o systemd
Algumas questões
- ssh é bifurcação depois de iniciado.
- Um túnel ssh deve ser executado em segundo plano
- Um processo do systemd é executado por padrão como tipo "simple" - que espera que o comando em StartExec seja o principal service (consulte "1")
- Para o systemd saber se seu serviço está ativo ou não, um PIDFile é requerido a maior parte do tempo. GuessMainPID padrão é sim, mas pode ser, e é em relação ao ssh, equivocado.
- Você mata o túnel localmente - não precisa ir para o exterior com uma espada
Isso apresenta muita complexidade, que é melhor tratada por um script de wrapper.
/etc/systemd/system/ssh-tunnel-foo-de.service
[Unit]
Description=Tunnel For ssh-tunnel-foo-de
After=network-online.target
[Unit]
Description=Tunnel For ssh-tunnel-foo-de
After=network-online.target
[Service]
User=autossh
ExecStart=/home/autossh/bin/ssh-tunnel.sh start
ExecStop=/home/autossh/bin/ssh-tunnel.sh stop
PIDFile=/home/autossh/bin/ssh-tunnel.pid
Restart=always
RestartSec=5s
StartLimitInterval=0
SuccessExitStatus=255
Type=forking
[Install]
WantedBy=multi-user.target
Explicações para systemd
O script wrapper salva o pid em PIDFile. Se você alterar o local, deverá manter seu arquivo de serviço e seu script de wrapper em sincronia.
Você deve definir o "Tipo" como forking para que o systemd saiba que uma bifurcação está acontecendo.
SuccessExitStatus - parece que o processo morre com 255 - então nós manipulamos isso para que um serviço interrompido não seja listado como "falhou" após ser interrompido.
Aguarde até que o network-online.target seja iniciado. Isso significa que você realmente tem uma conexão de rede, não apenas uma pilha de gerenciamento de rede. link link
Um script de wrapper:
/home/autossh/bin/ssh-tunnel.sh
É claro que você precisa decidir onde realmente quer colocar isso e consertar os caminhos de acordo.
#!/bin/bash
[email protected]
usage () {
echo "usage: $0 {start|stop}"
exit
}
cd $HOME/bin
case $1 in
"start")
/usr/bin/ssh -M -S socket-${MYHOST} -fnNT -o BatchMode=yes -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 -R 1080:localhost:1080 ${MYHOST}
EC=$? ; [ $EC -ne 0 ] && exit $EC
PID=$(/usr/bin/ssh -S socket-${MYHOST} -O check socket-${MYHOST} 2>&1 | awk '/Master running \(pid=/ { sub(/^.+pid=/,"") ; sub(")","") ; print }')
echo $PID > $HOME/bin/ssh-tunnel.pid
;;
"stop")
/usr/bin/ssh -S socket-${MYHOST} -O exit ${MYHOST}
/bin/rm -f $HOME/bin/ssh-tunnel.pid
exit 0
;;
*) usage ;;
esac
Algumas explicações:
Procure alguns dos parâmetros para ssh.
- -M e -S configura uma conexão mestre e um soquete nomeado para controlar o mestre.
- f - vai para o plano de fundo
- n - Impede a leitura de stdin (implícito por -f)
- N - Nenhum comando remoto
- T - Desabilita a alocação pseudo-tty
A parte "start" configura o túnel e o "master". Em seguida, ele consulta o mestre para o pid do túnel e o salva em um arquivo pid em benefício do systemd. Se executado como root, você pode salvar em / var / run / * pid.
A parte "stop" se conecta ao mestre e emite uma "saída". Em seguida, remove o arquivo pid.
Créditos ao link