回答:
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では-少なくとも-ブートプロセスで可能な限り遅く実行されることが保証されています。
UPSTARTに移行したくないが、従来のアプローチが必要な場合は、以下を行う必要があります。
注:別のディレクトリに同じ名前のサービスとプログラムを保存しています(ただし、サービスファイルに反映されている限り、これを変更できます)。「myscriptname」と「myprogramname」を実際の名前に変更してください!
/ usr / sbinにサービスとして実行するプログラムを保存します
sudo cp myprogramname /usr/sbin/myscriptname
基本的な起動スクリプトを作成します(参照として/etc/init.d/skeletonを使用します)
このスクリプトを/etc/init.dに移動します
sudo mv /etc/init.d/myscriptname
このスクリプトに実行許可を与えます(775を使用しましたが、より低く設定できます)
sudo chmod 755 /etc/init.d/myscriptname
goto /etc/init.d
cd /etc/init.d
起動優先度が低い起動リストに含める
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
:
/etc/rc.local
pleaserun
は、1つのコマンドでinitスクリプトを自動的に作成する問題を解決しようとするルビースクリプトです。そのページから引用:
「pleaserunを使用すると、次のランチャー/スクリプトなどを生成できます。
launchd
upstart
systemd
runit
sysv init」
また、使用されている初期化システムを検出し、それに応じてスクリプトを生成します。