Linux 如何为程序设置 init.d 脚本?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5817879/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 03:50:57  来源:igfitidea点击:

How do I set up an init.d script for a program?

linuxinit.d

提问by anjan

I have installed a program called node.js on my server to listen on port 8088

我在我的服务器上安装了一个名为 node.js 的程序来监听端口 8088

My server is a VPS package level 3 from hostgator.

我的服务器是来自 hostgator 的 VPS 包级别 3。

Now i m trying to create a init.d script so that node.js runs automatically with system and can restart if crashed autimatically.

现在我正在尝试创建一个 init.d 脚本,以便 node.js 与系统一起自动运行,并且可以在自动崩溃时重新启动。

After a bit googling on it, i came across some resources and mashed up a init.d script. Its more of a copy pasting job as u can see :) I got quite some problem, which most probably includes the init.d script having wrong sysntax.

在谷歌上搜索了一下之后,我发现了一些资源并混搭了一个 init.d 脚本。正如你所看到的,它更多的是复制粘贴工作:) 我遇到了很多问题,其中很可能包括 init.d 脚本的 sysntax 错误。

#! /bin/sh
#
# Copyright (c) 2011 Anjan Bhowmik
# All rights reserved.

# Author: Anjan Bhowmik, 2011
#
# /etc/init.d/nodejs
#   and its symbolic link
# /usr/sbin/rcnodejs

### BEGIN INIT INFO
# Provides:          nodejs
# Required-Start:    $network
# Required-Stop:
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: Node.js daemon
# Description:       NOde.js server that listens to port 8088
### END INIT INFO

$NODEJS_BIN = $(which node)
$NODEJS_JS_FILE = /home/anjan/server.js

# Load the rc.status script for this service.
. /etc/rc.status

# Reset status of this service
rc_reset

case "" in
    start)
        echo -n "Starting node.js "
        ## Start daemon with startproc(8). If this fails
        ## the return value is set appropriately by startproc.
        startproc $NODEJS_BIN $NODEJS_JS_FILE

        # Remember status and be verbose
        rc_status -v
        ;;
    stop)
        echo -n "Shutting down node.js "
        ## Stop daemon with killproc(8) and if this fails
        ## killproc sets the return value according to LSB.

        killproc -TERM $NODEJS_BIN

        # Remember status and be verbose
        rc_status -v
        ;;
    restart)
        ## Stop the service and regardless of whether it was
        ## running or not, start it again.
        
Linux onl.onlyfreelancer.com 2.6.18-028stab070.14 #1 SMP 
Thu Nov 18 16:04:02 MSK 2010 x86_64 x86_64 x86_64 GNU/Linux
stop
less /usr/share/doc/initscripts-*/sysvinitfiles
man 8 chkconfig
man 8 service
start # Remember status and be quiet rc_status ;; reload) # If it supports signaling: echo -n "Reload service node.js " killproc -HUP $NODEJS_BIN #touch /var/run/BAR.pid rc_status -v ## Otherwise if it does not support reload: #rc_failed 3 #rc_status -v ;; status) echo -n "Checking for service node.js " ## Check status with checkproc(8), if process is running ## checkproc will return with exit status 0. # Return value is slightly different for the status command: # 0 - service up and running # 1 - service dead, but /var/run/ pid file exists # 2 - service dead, but /var/lock/ lock file exists # 3 - service not running (unused) # 4 - service status unknown :-( # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.) # NOTE: checkproc returns LSB compliant status values. checkproc $NODEJS_BIN # NOTE: rc_status knows that we called this init script with # "status" option and adapts its messages accordingly. rc_status -v ;; *) ## If no parameters are given, print which are avaiable. echo "Usage: ##代码## {start|stop|status|restart|reload}" exit 1 ;; esac rc_exit

I really get confused as different systems use different approaches. My local ubuntu uses something called upstart, but my server doesn't seem to have upstart and uses init.d scripts only.

我真的很困惑,因为不同的系统使用不同的方法。我的本地 ubuntu 使用一种叫做 upstart 的东西,但我的服务器似乎没有 upstart 并且只使用 init.d 脚本。

If I issue a "uname -a" I get this:

如果我发出“uname -a”,我会得到这个:

##代码##

Also, I can't seem to find utils like "insserv" to enable this init.d script. So, if my init.s script is correct, how can I set it up correctly?

另外,我似乎找不到像“insserv”这样的工具来启用这个 init.d 脚本。那么,如果我的 init.s 脚本是正确的,我该如何正确设置它?

Any help is much appreciated, I've been battling this thing for 2 days with no luck yet.

非常感谢任何帮助,我已经与这件事搏斗了 2 天,但还没有运气。

采纳答案by Ignacio Vazquez-Abrams

##代码##

回答by viraptor

For critical apps you might also consider the "don't start services, run them" approach. supervisordand daemontoolsmight help here.

对于关键应用程序,您还可以考虑“不启动服务,运行它们”的方法。supervisorddaemontools可能在这里有所帮助。