現在、すべてのcrontab設定をsystemd-servicesに移植しています。つまり、自分のコンピュータで自動的に起動する必要がある作業用の単位を作成しています。
デバイスの1つが私に頭痛を与えました。私はこれを「uplink.service」と呼びます。その目的は、スクリプトを呼び出してサーバー用のリバースSSHトンネルを構築し、そのトンネルを確立することです。私が作ったユニットは次のとおりです。
[Unit]
Description = SSH-Uplink
After = network.target
[Service]
ExecStart = /bin/bash /root/script/uplink.sh
[Install]
WantedBy = multi-user.target
ユニットが指すスクリプトは次のとおりです。
ssh -fNC -R XXXX:localhost:22 user@ip -pXXXX -i ~/script/id_rsa
touch /tmp/uplinkonline
ご覧のように、デバッグ目的でこのスクリプトは/ tmpにuplinkonlineという新しいファイルを生成しようとします。これはうまくいきます。サービスの開始後にファイルが生成されるため、スクリプト自体が正常に呼び出されます。
これはsystemctlを起動しようとした後の出力です。
uplink.service - SSH-Uplink
Loaded: loaded (/etc/systemd/system/uplink.service; disabled;
vendor preset: disabled)
Active: inactive (dead)
Nov 07 10:44:01 loki systemd[1]: Started SSH-Uplink.
スクリプト自体は手動で起動したり、crontabを介して呼び出すときに機能します。しかし、どういうわけかsystemdはSSH接続を開始せずに他の動作とシャットダウンを期待しているようです。私は何が間違っていましたか?
答え1
スクリプトはssh
バックグラウンドで開始され、持続しませんが、systemd はサービスの開始時に実行されるプログラムを実行し続けたいと思います。
Type=oneshot
あなたがしなければならないのは、サービスユニットでこれを構成することで、これがワンタイムサービスであることをsystemdに通知することです。RemainAfterExit=yes
systemdが継続的にサービスを「up」としてリストするようにこれを含めることもできます。
つまり、サービスファイルを次のように更新します。
[Unit]
Description=SSH-Uplink
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash /root/script/uplink.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
(システム単位ファイルのストックスタイルには「=」の周りにスペースがないので、この部分も修正しました。)
期待どおりに機能ExecStop=
するようにSSHトンネルを解放するコマンドを追加することを検討できます。systemctl stop uplink