fedora 13 init.d 脚本无法停止

fedora 13 init.d 脚本无法停止

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

#!/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

答案1

遗憾的是,“守护进程”函数不会返回它启动的进程的实际 $!,以便您将其记录到 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 以便自行清理。

答案2

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

那应该可以杀死它

答案3

Gilles 可能说得对。您的问题是应用程序在 Java 下运行。并且,正如虚拟机(例如 Java、Python 等)中通常发生的情况一样,进程是“Java 某物”,而不仅仅是“某物”。

为了调试目的,请使用 pidof 检查其返回的内容。(使用 pidof java 查看子进程的 pid)

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

相关内容