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용 서비스 구성에 대한 유용한 지침일 수 있습니다.

관련 정보