これは非常に適した仕事ですsystemd
。
systemdサービスとしてスクリプトを実行する
システムがsystemdを実行している場合は、ライフサイクルと実行環境を制御するsystemdサービスとして実行するようにスクリプトを構成できます。また、ネットワークの起動や実行など、スクリプトを開始するための前提条件を提供できます。
独自のサービスに推奨されるフォルダーは/etc/systemd/system/
(別のオプションです/lib/systemd/system
が、通常はOOTBサービスにのみ使用する必要があります)。
以下を使用してファイルを作成しますsudo vim /etc/systemd/system/autossh.service
。
[Unit]
# By default 'simple' is used, see also https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
# Type=simple|forking|oneshot|dbus|notify|idle
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target
[Service]
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=pkill -9 autossh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody
# Useful during debugging; remove it once the service is working
StandardOutput=console
[Install]
WantedBy=multi-user.target
これで、サービスをテストできます。
sudo systemctl start autossh
サービスのステータスの確認:
systemctl status autossh
サービスの停止:
sudo systemctl stop autossh
サービスが期待どおりに機能することを確認したら、次のようにして有効にします。
sudo systemctl enable autossh
注:セキュリティを確保するためsystemd
に、スクリプトの実行方法と同様に、制限された環境でcrontab
スクリプトを実行します。したがって、$ PATHなどの既存のシステム変数に関する仮定を行わないでください。Environment
スクリプトで特定の変数を定義する必要がある場合は、キーを使用します。set -x
bashスクリプトの先頭に追加して実行systemctl status my_service
すると、スクリプトが失敗する理由を特定するのに役立つ場合があります。Tumbのルールとして、を含むすべてに常に絶対パスを使用するecho
か、を追加して$ PATHを明示的に定義しますEnvironment=MYVAR=abc
。