init.d 脚本出现错误

init.d 脚本出现错误

首先抱歉我的英语不好

好的,我写了一个 init.d 脚本,但我不知道它是真是假(我对这个还不熟悉)

#!/bin/sh
. /etc/init.d/someserver

start () {
    echo -n $"Starting someserver.jar: "

    java -jar /home/someserver/someserver.jar &
    echo $! > /home/someserver/someserver.pid
}

stop () {
    echo -n $"Stopping someserver.jar: "

    PID=$(/home/someserver/someserver.pid) 
    kill -9 $PID
}

restart() {
    stop
    start
}

case $1 in
    start)
        start
    ;;
    stop)
        stop
    ;;
    *)

    echo $"Usage: someserver {start|stop}"
    exit 1
esac

之后我使用这个命令;

$ sudo chmod 755 /etc/init.d/someserver

$ sudo update-rc.d someserver defaults

我得到了这个信息;

insserv: warning: script 'someserver' missing LSB tags and overrides

/etc/init.d/someserver: 6: .: 3: Too many open files

我搜索了错误和信息,但我不明白,那么这是什么意思,我该怎么办?

注意:os debian,我为 mmonit 编写此代码

答案1

您是否查看过其他初始化脚本以供参考?

让我们逐段地看一下。首先,让我们命名一个要执行的 shell。好的。

#!/bin/sh

现在请按照初始化系统的建议将 LSB 标签放在那里(告诉初始化系统依赖关系)

### BEGIN INIT INFO
# Provides:          someserver
# Required-Start:    $syslog $network $remote_fs
# Required-Stop:     $syslog $remote_fs
# Should-Start:      $local_fs $named
# Should-Stop:       $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: someserver
# Description:       Some Server
### END INIT INFO

然后你又自己找到了 init 脚本,为什么?这可能是你提到的错误发生的原因,因为这样它会被递归调用,这可能不是预期的结果。

通常你需要获取一些脚本来获得配置之类的东西:

# source some config (can be omitted)
[ -f /etc/configs/someserver ] && source /etc/configs/someserver

为什么每句话里都有美元符号echo?(好吧,我相信是本地化)

(注意:通过查看其他一些 init 脚本,您会发现 debian 使用 start-stop-daemon 来管理守护进程,因此您可以实现它。我在这里不这样做。)

start () {
    echo -n "Starting someserver.jar: "

    java -jar /home/someserver/someserver.jar &
    echo $! > /home/someserver/someserver.pid
}

您忘catstop()

另外,我不一定非要这样做kill -9,但首先kill。您可以检查它是否真的消失了,然后kill -9。同样,也许您应该使用start-stop-daemon

stop () {
    echo -n "Stopping someserver.jar: "

    PID=$(cat /home/someserver/someserver.pid) 
    kill $PID
}

通常情况下,您需要等待一段时间再重新启动

restart() {
    stop
    sleep 10
    start
}

最后你还应该实现restart

case "$1" in
    start)
      start
      ;;

    stop)
      stop
      ;;

    restart)
      restart
      ;;

    *)
      echo "Usage: someserver {start|stop|restart}"
      exit 1
      ;;
esac

还不错。但你忽略了一些细节。

相关内容