init rc.d が呼び出されず、サービスが停止します。

init rc.d が呼び出されず、サービスが停止します。

非常に単純な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

upstartSynologyがクラシックSysVinitからDSM 6に移動し、systemdDSM 7に移動したようです。どちらのinitシステムも、既存のSysVinitスタイルの起動/停止スクリプトの以前のバージョンとの互換性を提供しますが、知っておくべきいくつかの欠点があります。

DSM 7.0以降がある場合は、スクリプトをインストールした後にスクリプトを実行する必要があるため、そのファイルをsystemctl daemon-reload自動的systemd-sysv-generatorに生成する必要があります。その後、 - を使用してスクリプトを起動できます。実際にスクリプトを手動で実行するのではなく、これを行う必要があります。次の場合にのみタスクを実行する必要があることに気付くでしょう。.service/run/systemdsystemctl start <script name>systemd<your script> stopそれ対応する開始ジョブが実際に実行されました。

systemd各サービスが個別に設定されているためです。対照群プロセスの開始時にプロセス数(管理者が起動スクリプトを手動で実行した場合、これは実行されません)。

これはサービス自体にはまったく見えず(特に検索しない限り)、サービスのすべての子プロセスはこの制御グループのメンバーシップを継承します。制御グループにプロセスが残っていない場合は、自動的に存在しなくなります。

閉じるとsystemd、既存の制御グループだけが巡回され、デフォルト以外の制御グループが見つかると停止コマンドが実行されます。使用せずに開始されたすべてのサービスは、systemctl start「サービスX」制御グループの一部ではなく、「管理者のための対話型セッション」制御グループの一部になり、その停止スクリプトを実行せずにデフォルトで終了します。

何らかの理由でサービスが終了したら自動的に再起動するなどの機能が必要な場合は、その初期化システムに適した「ネイティブ」構成方法を使用することを検討する必要があります。

  • /etc/init/*Synology DSM 6.x シリーズの Upstart ファイル
  • /etc/systemd/system/*.serviceSynology DSM 7.x シリーズ以降の systemd ファイル。これらのinitシステムには、サービスプロセスを直接監視するためにラッパースクリプトを作成する必要なく、わずかな構成で使用できる自動再起動機能が組み込まれています。

Synology DSM 7開発者ガイド

Synology DSM 6開発者ガイド

DSM 6 および 7 用のサービスを構成するための便利なガイドラインかもしれません。

関連情報