Nenhuma mensagem de erro no journactl do serviço personalizado

3

Eu tento escrever um arquivo de serviço personalizado.

Infelizmente não vejo saída no journalctl.

Aqui está o meu arquivo de unidade:

root@om:~# cat /etc/systemd/system/ssh-tunnel-foo-de.service 
[Unit]
Description=Tunnel For ssh-tunnel-foo-de
After=network.target

[Service]
User=autossh
ExecStart=/usr/bin/ssh -o "ExitOnForwardFailure yes" -o "ServerAliveInterval 60" -N -R 1080:localhost:1080 [email protected]
ExecStartPre=-/usr/bin/ssh [email protected] "for pid in  $$(ps -u tunnel | grep sshd| cut -d' ' -f1); do kill -9 $$pid; echo kill old ssh process $$pid; done"
Restart=always
RestartSec=5s
StartLimitInterval=0

[Install]
WantedBy=multi-user.target 

Logoutput:

root@om:~# journalctl -u ssh-tunnel-foo-de
Apr 01 10:12:28 om systemd[1]: Stopped Tunnel For ssh-tunnel-foo-de.
Apr 01 10:12:28 om systemd[1]: Starting Tunnel For ssh-tunnel-foo-de...
Apr 01 10:12:28 om systemd[1]: Started Tunnel For ssh-tunnel-foo-de.
Apr 01 10:12:28 om systemd[1]: ssh-tunnel-foo-de.service: Main process exited, code=exited, status=217/USER
Apr 01 10:12:28 om systemd[1]: ssh-tunnel-foo-de.service: Unit entered failed state.
Apr 01 10:12:28 om systemd[1]: ssh-tunnel-foo-de.service: Failed with result 'exit-code'.

Como posso depurar o que está errado? Eu acho que alguma saída stderr se perde.

    
por guettli 01.04.2017 / 10:17

2 respostas

3

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

  1. ssh é bifurcação depois de iniciado.
  2. Um túnel ssh deve ser executado em segundo plano
  3. Um processo do systemd é executado por padrão como tipo "simple" - que espera que o comando em StartExec seja o principal service (consulte "1")
  4. 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.
  5. 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

    
por 04.04.2017 / 10:22
0

A linha User=autossh foi o erro.

Este usuário não existia.

Depois de criar o usuário, funcionou.

O padrão Type=simple funciona bem.

Não há necessidade de um script de wrapper.

    
por 10.04.2017 / 21:53