SysVサービスをスクリプトからsystemdの単位ファイルに移行したいと思います。ホストとスレーブの2台のコンピュータがあります。どちらのシステムも起動時にサービスが有効になりますが、サービスは常にマスターシステムで実行されます。他のコンピュータのサービス状態を確認し、それに基づいて次のコマンドを実行し続けたり、何もしないExecConditionを追加したいと思います。
systemctl is-active myservice -H kbc01
このコマンドは、活動状態または非活動状態を表示します。
active (0)
inactive (3)
私の意見では、他のコンピュータのサービスがアクティブ(0)の場合、次のExecStartコマンドは実行されません。他のコンピュータのサービスがダウンしている場合(3)、次のExecstartコマンドを実行します。
systemd ドキュメントによると、次の ExecCondition= コマンドは 1 から 254 (含む) の終了コードで終了し、残りのコマンドはスキップされ、デバイスは失敗としてマークされません。
どうすれば逆にできますか?
ホスト(kbc01):
[Unit]
Description=Aplication
After=local-fs.target network-online.target
[Service]
ExecCondition=systemctl is-active myservice -H kbc01
ExecStart=/home/user/aplication/bin/myservicestart
ExecStop=/home/user/aplication/bin/myserviceshutdown
Restart=on-failure
[Install]
WantedBy=multi-user.target
補助機械(kbc02):
[Unit]
Description=Aplication
After=local-fs.target network-online.target
[Service]
ExecCondition=systemctl is-active myservice -H kbc02
ExecStart=/home/user/aplication/bin/myservicestart
ExecStop=/home/user/aplication/bin/myserviceshutdown
Restart=on-failure
[Install]
WantedBy=multi-user.target
答え1
systemctl is-active
直接呼び出すのではなく、ロジックを使用してbashスクリプトを呼び出すことができます。
[Service]
ExecCondition=/usr/local/sbin/myservice-is-needed kbc02
#!/bin/bash
# /usr/local/sbin/myservice-is-needed
systemctl is-active myservice -H "$1"
retval=$?
if [ "$retval" -ne 0 ]; then
exit 0;
fi
exit 1
または1行にしてください:
[Service]
ExecCondition=/bin/bash -c '! systemctl is-active myservice -H kbc02'