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

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

コメントへの応答で追加

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


1
実際、私のデーモンはinit.dを使用するFirebirdデータベースサーバーに依存しています。
イヴァン

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. 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アマゾンクラウド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

:

1
@jakeGoldあなたは実際に「私の」コードを再フォーマットするのに時間をかけましたか。それはあなたがそれをテストし、それがあなたのために働いたことを意味しますか?
トニーギル14

1
それは私のために働いた
マリオS

systemdを支持して、今は新興企業は死んでいませんか?
ガレスピー

実際、upstartは私の最近のUbuntuにもインストールされていません。SysV initスクリプトが死ぬことはありません。
クリスナドビッチ

8

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


また、rcX.dにシンボリックリンクを作成する必要もあります。ただし、Ubuntuの更新により、カスタムシンボリックリンクがすべて消去されます。
ロビン・スー

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

1

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

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

launchd
upstart
systemd
runit
sysv init」

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


pleaserunもロギングを行うかどうかはわかりませんが、このもう1つのロギングもあります:gist.github.com/naholyr/4275302
Costin Gușă 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.