Назад | Перейти на главную страницу

Нет сообщения об ошибке в журнале пользовательской службы

Пытаюсь написать собственный служебный файл.

К сожалению, я не вижу вывода в journalctl.

Вот мой юнит-файл:

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 tunnel@foo.de
ExecStartPre=-/usr/bin/ssh tunnel@foo.de "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 

Выход из системы:

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'.

Как я могу отладить, что не так. Я предполагаю, что некоторые выходные данные stderr теряются.

Введение

Ваш исходный вопрос касается того, как вы можете получить больше результатов от systemd. Посмотри на Как отладить модуль systemd ExecStart

Но давайте посмотрим, не сможем ли мы сначала заставить ваш сервис работать.

О systemd

Некоторые вопросы

  1. ssh это разветвление после того, как это началось.
  2. Туннель ssh должен работать в фоновом режиме
  3. Процесс systemd по умолчанию запускается как "простой" тип, что предполагает, что команда в StartExec является основная служба (см. «1»)
  4. Для того, чтобы systemd знала, активен ли ваш сервис или нет, PIDFile требуется много времени. GuessMainPID по умолчанию да, но может быть и является Касаемо ssh, ошибаюсь.
  5. Вы пробиваете туннель локально - не нужно ехать за границу с мечом

Это создает большую сложность, с которой лучше справляется сценарий-оболочка.

/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

Пояснения к systemd

Скрипт-оболочка сохраняет pid в PIDFile. Если вы меняете местоположение, вы должны синхронизировать свой служебный файл и сценарий оболочки.

Вы должны установить «Тип» на разветвление, чтобы systemd знала, что происходит разветвление.

SuccessExitStatus - кажется, что процесс умирает с 255 - поэтому мы обрабатываем это так, чтобы остановленная служба не отображалась как «сбойная» после ее остановки.

Подождите, пока не запустится network-online.target. Это означает, что у вас действительно есть сетевое соединение, а не только стек управления сетью. https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ https://www.freedesktop.org/software/systemd/man/systemd.unit.html#

Скрипт-оболочка:

/home/autossh/bin/ssh-tunnel.sh

Конечно, вам нужно решить, где вы действительно хотите разместить это, и соответствующим образом исправить пути.

#!/bin/bash
MYHOST=tunnel@foo.de

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

Некоторые пояснения:

Найдите некоторые параметры для ssh.

  • -M и -S устанавливают главное соединение и именованный сокет для управления мастером.
  • f - перейти на задний план
  • n - запретить чтение из stdin (подразумевается -f)
  • N - Нет удаленной команды
  • T - Отключить выделение псевдо-tty

«Стартовая» часть устанавливает туннель и «мастер». Затем он запрашивает у мастера pid-адрес туннеля и сохраняет его в pid-файле для использования systemd. При запуске от имени root вы можете сохранить в / var / run / * pid.

Часть «стоп» подключается к мастеру и выдает «выход». Затем удаляет файл pid.

Кредиты для https://stackoverflow.com/a/15198031/2045924

Линия User=autossh была ошибка.

Этот пользователь не существует.

После создания пользователя все заработало.

По умолчанию Type=simple хорошо работает.

Нет необходимости в сценарии-оболочке.