非常に単純なSysVinitサービスがあります/etc/rc.d
。
#!/bin/bash
PIDFILE="/var/run/test.pid"
status() {
if [ -f "$PIDFILE" ]; then
echo 'Service running'
return 1
fi
return 0
}
start() {
if [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE")"; then
echo 'Service already running'
return 1
fi
echo 'Starting...'
test & echo $! > "$PIDFILE"
return 0
}
stop() {
if [ ! -f "$PIDFILE" ] || ! kill -0 "$(cat "$PIDFILE")"; then
echo 'Service not running'
return 1
fi
echo 'Stopping...'
kill -15 "$(cat "$PIDFILE")" && rm -f "$PIDFILE"
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
システムが起動すると、このサービスが開始されます。
ただし、システムが停止しても停止コマンドは呼び出されません。私が考えることができる唯一の理由は、システムがサービスが実行されていないか、正しく起動されていないと思うからです。
しかし、そうするための要件は何ですか?
- 開始コマンドの特別な終了コードを返す必要がありますか?
/var/lock/subsys
アクティブであることを示すためにファイルを作成する必要がありますか?- システムにサービスが開始されなかったと思わせる他の要因はありますか?
答え1
upstart
SynologyがクラシックSysVinitからDSM 6に移動し、systemd
DSM 7に移動したようです。どちらのinitシステムも、既存のSysVinitスタイルの起動/停止スクリプトの以前のバージョンとの互換性を提供しますが、知っておくべきいくつかの欠点があります。
DSM 7.0以降がある場合は、スクリプトをインストールした後にスクリプトを実行する必要があるため、そのファイルをsystemctl daemon-reload
自動的systemd-sysv-generator
に生成する必要があります。その後、 - を使用してスクリプトを起動できます。実際にスクリプトを手動で実行するのではなく、これを行う必要があります。次の場合にのみタスクを実行する必要があることに気付くでしょう。.service
/run/systemd
systemctl start <script name>
systemd
<your script> stop
それ対応する開始ジョブが実際に実行されました。
systemd
各サービスが個別に設定されているためです。対照群プロセスの開始時にプロセス数(管理者が起動スクリプトを手動で実行した場合、これは実行されません)。
これはサービス自体にはまったく見えず(特に検索しない限り)、サービスのすべての子プロセスはこの制御グループのメンバーシップを継承します。制御グループにプロセスが残っていない場合は、自動的に存在しなくなります。
閉じるとsystemd
、既存の制御グループだけが巡回され、デフォルト以外の制御グループが見つかると停止コマンドが実行されます。使用せずに開始されたすべてのサービスは、systemctl start
「サービスX」制御グループの一部ではなく、「管理者のための対話型セッション」制御グループの一部になり、その停止スクリプトを実行せずにデフォルトで終了します。
何らかの理由でサービスが終了したら自動的に再起動するなどの機能が必要な場合は、その初期化システムに適した「ネイティブ」構成方法を使用することを検討する必要があります。
/etc/init/*
Synology DSM 6.x シリーズの Upstart ファイル/etc/systemd/system/*.service
Synology DSM 7.x シリーズ以降の systemd ファイル。これらのinitシステムには、サービスプロセスを直接監視するためにラッパースクリプトを作成する必要なく、わずかな構成で使用できる自動再起動機能が組み込まれています。