init.d에 커스텀 데몬을 올바르게 추가하는 방법은 무엇입니까?


26

몇 가지 명령 줄로 시작하고 중지 할 수있는 타사 독점 응용 프로그램 서버 데몬이 있습니다. 시스템을 시작할 때 시작하고 시스템 종료시 올바르게 중지하려면이 데몬이 필요합니다. 이것을 올바르게 구현하려면 어떻게합니까? /etc/init.d 안에 일부 스크립트를 복사하고 그에 따라 수정하면 충분합니까?

답변:


16

init.d는 데몬을 시작하기 위해 사용되지 않는 오래된 시스템입니다. upstart에 의해 대체되었습니다 . Upstart는 훨씬 쉽게 구성 할 수있는 장점이 있으며 작업 초기화의 올바른 순서를 지정할 수 있습니다.

upstart의 구성 파일은 / etc / init에 있으며 데몬에 필수 구성 요소가없는 경우 tty1.conf처럼 간단 할 수 있습니다.

# tty1 - getty
#
# This service maintains a getty on tty1 from the point the system is
# started until it is shut down again.

start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]

respawn
exec /sbin/getty -8 38400 tty1

이 경우 해당 파일을 복사하고 취향에 맞게 수정할 수 있습니다. 보다 복잡한 구성은 시작 사이트 및 / etc / init의 다른 항목에 가장 잘 기록되어 있습니다.

의견에 대한 답변으로 추가

upstart를 사용하든 init.d를 사용하든 Firebird가 올바르게 초기화되는 시점을 결정하는 방법이 필요합니다. 불행히도 Firebird 자체 는 설치되어 실행 중인지 확인하는 좋은 방법이없는 것 같습니다 . 따라서 프로그램 시작을 /etc/rc.local에 고정시키는 권장 사항은 확실히 가장 쉽고, 우분투에서는 최소한 부팅 프로세스에서 가능한 한 늦게 실행되도록 보장됩니다.


1
실제로 내 데몬은 init.d를 사용하는 Firebird 데이터베이스 서버에 의존합니다.
Ivan

12

UPSTART로 마이그레이션하지 않고 클래식 한 접근 방식을 원하는 경우 다음을 수행해야합니다.

참고 : 다른 디렉토리에 동일한 이름으로 서비스와 프로그램을 저장하고 있습니다 (서비스 파일에 반영되어 있으면 변경할 수 있습니다). "myscriptname"및 "myprogramname"을 실제 이름으로 변경하십시오!

  1. / usr / sbin에 서비스로 실행될 프로그램을 저장하십시오.

    sudo cp myprogramname /usr/sbin/myscriptname

  2. 기본 시작 스크립트 생성 (/etc/init.d/skeleton을 참조로 사용)

  3. 이 스크립트를 /etc/init.d로 옮기십시오

    sudo mv /etc/init.d/myscriptname

  4. 이 스크립트에 실행 권한을 부여하십시오 (775를 사용했지만 더 낮게 설정할 수 있습니다)

    sudo chmod 755 /etc/init.d/myscriptname

  5. /etc/init.d로 이동

    cd /etc/init.d

  6. 시작 우선 순위가 낮은 시작 목록에 포함

    sudo update-rc.d myscriptname defaults 97 03

컴퓨터를 재부팅하고 서비스가 제대로 시작되었는지 확인하십시오

sudo ps -A --sort cmd

서비스가 제대로 시작되지 않으면 먼저 직접 호출 할 때 서비스가 실행되는지 확인해야합니다.

cd /etc/init.d
sudo service myscriptname start

아래에는 실제로 작동하는 샘플 서비스 파일이 포함되어 있습니다. 구성해야하는 것을 이해하기 위해이를 골격 서비스와 비교하십시오. 참고 :이 기능은 Ubuntu 12.04 Amazon Cloud AWS EC2 클래식 LAMP 구현 (구분 투 15.10)에서도 작동합니다.

#! /bin/sh
### BEGIN INIT INFO
# Provides:          
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Sample_GT02 daemon startup script
# Description:       Sample Server for GT02 class 
### END INIT INFO

# Author: Tony Gil 
#

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Sample Daemon"
NAME=sampleserver_gt02
DAEMON=/usr/sbin/$NAME
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
CHUID=root

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
   # Return
   #   0 if daemon has been started
   #   1 if daemon was already running
   #   2 if daemon could not be started
   start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
      || return 1
   start-stop-daemon --start --quiet --chuid $CHUID --pidfile $PIDFILE --exec $DAEMON -- \
      $DAEMON_ARGS \
      || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
   # Return
   #   0 if daemon has been stopped
   #   1 if daemon was already stopped
   #   2 if daemon could not be stopped
   #   other if a failure occurred
   start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
   RETVAL="$?"
   [ "$RETVAL" = 2 ] && return 2
   # Wait for children to finish too if this is a daemon that forks
   # and if the daemon is only ever run from this initscript.
   # If the above conditions are not satisfied then add some other code
   # that waits for the process to drop all resources that could be
   # needed by services started subsequently.  A last resort is to
   # sleep for some time.
   start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
   [ "$?" = 2 ] && return 2
   # Many daemons don't delete their pidfiles when they exit.
   rm -f $PIDFILE
   return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
   #
   # If the daemon can reload its configuration without
   # restarting (for example, when it is sent a SIGHUP),
   # then implement that here.
   #
   start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
   return 0
}

case "$1" in
  start)
   [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
   do_start
   case "$?" in
      0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
      2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
   esac
   ;;
  stop)
   [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
   do_stop
   case "$?" in
      0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
      2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
   esac
   ;;
  #reload|force-reload)
   #
   # If do_reload() is not implemented then leave this commented out
   # and leave 'force-reload' as an alias for 'restart'.
   #
   #log_daemon_msg "Reloading $DESC" "$NAME"
   #do_reload
   #log_end_msg $?
   #;;
  restart|force-reload)
   #
   # If the "reload" option is implemented then remove the
   # 'force-reload' alias
   #
   log_daemon_msg "Restarting $DESC" "$NAME"
   do_stop
   case "$?" in
     0|1)
      do_start
      case "$?" in
         0) log_end_msg 0 ;;
         1) log_end_msg 1 ;; # Old process is still running
         *) log_end_msg 1 ;; # Failed to start
      esac
      ;;
     *)
        # Failed to stop
      log_end_msg 1
      ;;
   esac
   ;;
  *)
   #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
   echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
   exit 3
   ;;
esac

:

1
@jake 실제로 "my"코드를 다시 포맷하는 데 시간이 걸렸습니다. 그것은 당신이 그것을 테스트하고 당신을 위해 일했다는 것을 의미합니까?
tony gil

1
그것은 나를 위해 일했다
Mario S

시스템 시작을 위해 지금 시작하지 않았습니까?
Gillespie

사실, 최근의 우분투에는 upstart가 설치되어 있지 않습니다. SysV 초기화 스크립트는 절대 죽지 않습니다.
크리스 나도 비치

8

/etc/init.d/skeleton의 사본을 만들어 서비스를 시작 / 중지 / 다시 시작하기 위해 적절한 위치에서 편집하십시오. 주석이 잘 달렸으므로 init.d 스크립트를 즉시 작성할 수 있습니다.


또한 rcX.d에서 심볼릭 링크를 만들어야 함을 의미합니다. 그러나 Ubuntu 업데이트는 모든 사용자 정의 기호 링크를 지 웁니다.
Robin Hsu

2
  • 에 명령을 추가하십시오 /etc/rc.local
  • 따라서 시스템 시작시 데몬이 자동으로 시작됩니다.

1

pleaserun단일 명령으로 init 스크립트를 자동으로 작성하는 문제를 해결하려는 루비 스크립트입니다. 페이지에서 인용 :

"pleaserun을 사용하면 다음 실행기 / 스크립트 / 무엇이든 생성 할 수 있습니다.

launchd에
신출내기
systemd
runit
SYSV 초기화 "

또한 사용중인 init 시스템을 감지하여 그에 따라 스크립트를 생성합니다.


pleaserun도 로깅을 수행하는지 확실하지 않지만,이 또한 로깅을 수행합니다. gist.github.com/naholyr/4275302
Costin Gușă
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.