Пытаюсь написать собственный служебный файл.
К сожалению, я не вижу вывода в 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
Но давайте посмотрим, не сможем ли мы сначала заставить ваш сервис работать.
Это создает большую сложность, с которой лучше справляется сценарий-оболочка.
[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
Скрипт-оболочка сохраняет 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#
Конечно, вам нужно решить, где вы действительно хотите разместить это, и соответствующим образом исправить пути.
#!/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.
«Стартовая» часть устанавливает туннель и «мастер». Затем он запрашивает у мастера pid-адрес туннеля и сохраняет его в pid-файле для использования systemd. При запуске от имени root вы можете сохранить в / var / run / * pid.
Часть «стоп» подключается к мастеру и выдает «выход». Затем удаляет файл pid.
Кредиты для https://stackoverflow.com/a/15198031/2045924
Линия User=autossh
была ошибка.
Этот пользователь не существует.
После создания пользователя все заработало.
По умолчанию Type=simple
хорошо работает.
Нет необходимости в сценарии-оболочке.