답변:
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에 고정시키는 권장 사항은 확실히 가장 쉽고, 우분투에서는 최소한 부팅 프로세스에서 가능한 한 늦게 실행되도록 보장됩니다.
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
/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 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
:
pleaserun
단일 명령으로 init 스크립트를 자동으로 작성하는 문제를 해결하려는 루비 스크립트입니다. 페이지에서 인용 :
"pleaserun을 사용하면 다음 실행기 / 스크립트 / 무엇이든 생성 할 수 있습니다.
launchd에
신출내기
systemd
runit
SYSV 초기화 "
또한 사용중인 init 시스템을 감지하여 그에 따라 스크립트를 생성합니다.