Fedora 13 init.d脚本,不能停止

我写了init.d脚本,假设运行java CLI proccess。
问题是,当我停止它,我得到[失败],并且进程仍在运行。
谢谢

#!/usr/bin/env bash # # chkconfig: 345 97 03 # # processname: quotes-srv # # # source function library . /etc/rc.d/init.d/functions NAME=quotes-srv start() { echo -n $"Starting $NAME: " daemon +19 java -Dlog4j.configuration="file:/opt/quotes/properties/log4j/log4j.properties" -Dproperties_folder="/opt/quotes/properties/app/" -jar /opt/quotes/trade-0.0.1-SNAPSHOT-jar-with-dependencies.jar & touch /var/lock/subsys/$NAME } stop() { echo -n $"Stopping $NAME: " killproc $NAME echo rm -f /var/lock/subsys/$NAME } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart|force-reload|reload) restart ;; condrestart|try-restart) [ -f /var/lock/subsys/$NAME ] && restart ;; status) status $NAME ;; *) echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}" exit 1 esac exit 0 

守护进程的function可悲的是不会返回实际的$! 它启动的过程中将其logging到一个pid文件。 你应该做的是把你的Java启动包装在一个shell脚本中,然后守护那个脚本。

 #!/bin/sh java -Dlog4j.configuration="file:/opt/quotes/properties/log4j/log4j.properties" \ -Dproperties_folder="/opt/quotes/properties/app/" \ -jar /opt/quotes/trade-0.0.1-SNAPSHOT-jar-with-dependencies.jar & echo $! /var/run/javaprogram.pid 

然后使用–pidfile选项启动守护进程,以防止多个启动:

 daemon --pidfile=/var/run/javaprogram.pid /path/to/script/javaprogram.sh 

…和你的stop()添加一个rm -f /var/run/javaprogram.pid来清理你自己。

您可能希望将启动时的pid保存在/ var / run somewhere中的.pid文件中,然后使用killproc -p pid name

这应该杀死它

吉尔斯是对的​​。 你的问题是应用程序正在Java下运行。 而且正如虚拟机(如java,python等)通常发生的那样,这个过程是“java something”而不是“something”。

为了进行debugging,请查看pidof以查看返回结果。 (检查pidof java来查看你的subprocess的pid)

你可以做的是使用ps aux | awk / program /'{print $ 2}'并杀死这些pid,或者find一个启动java应用程序的init文件,看看它是如何完成的:>