Làm thế nào để thêm chính xác một daemon tùy chỉnh vào init.d?


26

Tôi đã có một trình nền máy chủ ứng dụng độc quyền của bên thứ 3 có thể được khởi động và dừng lại bởi một vài dòng lệnh. Tôi cần trình nền này để khởi động khi hệ thống khởi động và dừng chính xác khi tắt hệ thống. Làm thế nào để tôi thực hiện chính xác điều này? Có đủ để sao chép một số tập lệnh bên trong /etc/init.d và sửa đổi nó cho phù hợp không?

Câu trả lời:


16

init.d là hệ thống cũ, không dùng nữa để bắt đầu trình nền; đã được thay thế bởi mới bắt đầu . Upstart có lợi thế là dễ dàng hơn nhiều để cấu hình và cho phép sắp xếp trình tự nhiệm vụ thích hợp.

Các tệp cấu hình để khởi động trực tiếp trong / etc / init và nếu trình nền của bạn không có điều kiện tiên quyết, nó có thể đơn giản như 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

trong trường hợp đó bạn có thể sao chép tập tin đó và sửa đổi theo sở thích. Các cấu hình phức tạp hơn được ghi lại tốt nhất tại trang web mới nhất và trong các mục khác trong / etc / init.

thêm vào để trả lời bình luận

Cho dù bạn sử dụng mới bắt đầu hay init.d, bạn vẫn sẽ cần một số cách xác định khi nào Firebird được khởi tạo đúng cách. Thật không may, bản thân Firebird dường như không có cách nào tốt để xác minh rằng nó đã được cài đặt và chạy . Do đó, đề xuất gắn chương trình của bạn bắt đầu vào /etc/rc.local chắc chắn là dễ nhất và trên Ubuntu - ít nhất - được đảm bảo chạy càng muộn càng tốt trong quá trình khởi động.


1
Trên thực tế, trình nền của tôi phụ thuộc vào máy chủ cơ sở dữ liệu Firebird, sử dụng init.d.
Ivan

12

nếu bạn không muốn chuyển sang UPSTART, nhưng muốn cách tiếp cận cổ điển, bạn phải:

LƯU Ý: tôi đang lưu dịch vụ và chương trình có cùng tên trong các thư mục khác nhau (nhưng bạn có thể thay đổi điều này, miễn là nó được phản ánh trong tệp dịch vụ của bạn). thay đổi "myscriptname" và "myprogramname" thành tên thật!

  1. lưu chương trình của bạn sẽ chạy như một dịch vụ trong / usr / sbin

    sudo cp myprogramname /usr/sbin/myscriptname

  2. tạo tập lệnh khởi động cơ bản (sử dụng /etc/init.d/skotte làm tài liệu tham khảo)

  3. di chuyển tập lệnh này đến /etc/init.d

    sudo mv /etc/init.d/myscriptname

  4. cấp cho tập lệnh này quyền thực thi (tôi đã sử dụng 775, nhưng bạn có thể đặt nó thấp hơn)

    sudo chmod 755 /etc/init.d/myscriptname

  5. goto /etc/init.d

    cd /etc/init.d

  6. bao gồm trong danh sách khởi động với mức độ ưu tiên khởi động thấp

    sudo update-rc.d myscriptname defaults 97 03

khởi động lại máy của bạn và kiểm tra xem dịch vụ đã khởi động đúng chưa

sudo ps -A --sort cmd

nếu dịch vụ của bạn không bắt đầu đúng cách, trước tiên bạn nên kiểm tra xem nó có chạy khi được gọi bằng tay không:

cd /etc/init.d
sudo service myscriptname start

bên dưới tôi bao gồm một tệp dịch vụ mẫu thực sự hoạt động. so sánh nó với dịch vụ bộ xương để hiểu những gì bạn cần cấu hình. LƯU Ý: điều này hoạt động trên triển khai LAMP cổ điển AWS EC2 trên đám mây Ubuntu 12.04 (cũng trên Kubfox 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
@jakeGould bạn thực sự đã dành thời gian để định dạng lại mã "của tôi". điều đó có nghĩa là bạn đã thử nghiệm nó và nó đã làm việc cho bạn?
tony gil

1
nó làm việc cho tôi
Mario S

Bây giờ không phải là bắt đầu chết vì ủng hộ systemd?
Gillespie

Thật vậy, mới bắt đầu thậm chí không được cài đặt trên Ubuntu gần đây của tôi. SysV init script sẽ không bao giờ chết.
Chris Nadovich

8

Tạo một bản sao của /etc/init.d/sk MP và chỉnh sửa nó ở những nơi thích hợp để bắt đầu / dừng / khởi động lại dịch vụ của bạn. Nó được nhận xét rất tốt vì vậy bạn sẽ có thể tạo một tập lệnh init.d hoạt động nhanh chóng.


Điều đó có nghĩa là bạn cũng cần tạo các liên kết tượng trưng trong RCX.d. Tuy nhiên, bản cập nhật Ubuntu sẽ xóa sạch tất cả các liên kết tượng trưng tùy chỉnh của bạn.
Robin Hsu

2
  • Thêm lệnh của bạn vào /etc/rc.local
  • Vì vậy, daemon của bạn sẽ bắt đầu tự động khi khởi động hệ thống.

1

pleaserunlà một tập lệnh ruby ​​cố gắng giải quyết vấn đề tự động tạo tập lệnh init bằng một lệnh duy nhất. trích dẫn từ trang của nó:

"Với pleaserun, bạn có thể tạo các trình khởi chạy / tập lệnh / bất cứ điều gì sau đây:

launchd
upstart
systemd
runit
sysv init "

Nó cũng phát hiện hệ thống init nào đang được sử dụng để nó tạo ra kịch bản phù hợp.


không chắc chắn nếu pleaserun cũng đăng nhập, nhưng cái này cũng có đăng nhập: gist.github.com/naholyr/4275302
Costin Gușă
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.