首先抱歉我的英语不好
好的,我写了一个 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
}
您忘cat
了stop()
。
另外,我不一定非要这样做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
还不错。但你忽略了一些细节。