カスタムサービスファイルを書こうとしています。
残念ながら、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 [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
ログ出力:
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
[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
Sshのパラメーターのいくつかを調べます。
「開始」部分は、トンネルと「マスター」を設定します。次に、マスターにトンネルのpidを照会し、systemdの利益のためにこれをpidファイルに保存します。 rootとして実行する場合は、/ var/run/* pidに保存できます。
「stop」部分はマスターに接続し、「exit」を発行します。次に、pidファイルを削除します。
この線 User=autossh
は間違いでした。
このユーザーは存在しませんでした。
ユーザーを作成した後、うまくいきました。
デフォルト Type=simple
うまくいきます。
ラッパースクリプトは必要ありません。