web-dev-qa-db-ja.com

init.dにカスタムデーモンを正しく追加する方法

いくつかのコマンドラインで起動および停止できるサードパーティの専用アプリケーションサーバーデーモンがあります。システムの起動時にこのデーモンを起動し、システムのシャットダウン時に正しく停止する必要があります。これを正しく実装するにはどうすればよいですか? /etc/init.d内にいくつかのスクリプトをコピーし、それに応じて変更するだけで十分ですか?

26
Ivan

init.dは、デーモンを起動するための古い非推奨のシステムです。 pstart に置き換えられました。 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

その場合、そのファイルをコピーして、好みに合わせて変更できます。より複雑な構成については、upstartサイトおよび/ etc/initの他のエントリで最もよく文書化されています。

コメントへの応答で追加

Upstartを使用するかinit.dを使用するかにかかわらず、Firebirdが適切に初期化されるタイミングを決定する何らかの方法が必要です。残念ながら、Firebird自体は インストールおよび実行中 であることを確認する良い方法がないようです。したがって、プログラムの開始を/etc/rc.localに固定することは確かに最も簡単であり、Ubuntuでは-少なくとも-ブートプロセスで可能な限り遅く実行されることが保証されています。

16
msw

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. goto /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クラウドAWS EC2クラシックLAMP実装で動作します(Kubuntu 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

:
12
tony gil

/etc/init.d/skeletonのコピーを作成し、適切な場所で編集してサービスを開始/停止/再起動します。非常によくコメントされているため、すぐに有効なinit.dスクリプトを作成できるはずです。

8
phuihock
  • コマンドを/etc/rc.localに追加します
  • そのため、デーモンはシステムの起動時に自動的に起動します。
2
karthick87

pleaserun は、1つのコマンドでinitスクリプトを自動的に作成する問題を解決しようとするRubyスクリプトです。そのページから引用:

「pleaserunを使用すると、次のランチャー/スクリプトなどを生成できます。

打ち上げられた
upstart
systemd
それを実行します
sysv init "

また、使用中の初期化システムを検出し、それに応じてスクリプトを生成します。

1
Costin Gușă