从 init 脚本运行任意程序作为守护进程

12 redhat service init.d

我需要在 Red Hat 中安装一个程序作为服务。它不后台运行、管理其 PID 文件或管理自己的日志。它只是运行并打印到 STDOUT 和 STDERR。

使用标准的 init 脚本作为指南,我开发了以下内容:

#!/bin/bash
#
#   /etc/rc.d/init.d/someprog
#
# Starts the someprog daemon
#
# chkconfig: 345 80 20
# description: the someprog daemon
# processname: someprog
# config: /etc/someprog.conf

# Source function library.
. /etc/rc.d/init.d/functions

prog="someprog"
exec="/usr/local/bin/$prog"
[ -e "/etc/sysconfig/$prog" ] && . "/etc/sysconfig/$prog"
lockfile="/var/lock/subsys/$prog"
RETVAL=0

check() {
    [ `id -u` = 0 ] || exit 4
    test -x "$exec" || exit 5
}

start() {
    check
    if [ ! -f "$lockfile" ]; then
        echo -n $"Starting $prog: " 
        daemon --user someproguser "$exec"
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch "$lockfile"
        echo
    fi
    return $RETVAL
}

stop() {
    check
    echo -n $"Stopping $prog: "
    killproc "exec"
    RETVAL=$?
    [ $RETVAL -eq 0 ] && rm -f "$lockfile"
    echo
    return $RETVAL
}

restart() {
    stop
    start
}   

case "$1" in
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    restart
    ;;
status)
    status "$prog"
    RETVAL=$?
    ;;
*)
    echo $"Usage: $0 {start|stop|restart|status}"
    RETVAL=2
esac

exit $RETVAL
Run Code Online (Sandbox Code Playgroud)

可能是我的错误是复制粘贴并修改了 /etc/init.d 中的一些现有脚本。无论如何,由此产生的服务表现得很奇怪:

  • 当我启动它时service someprog start,程序会打印到终端并且命令没有完成。
  • 如果我按 CTRL-C,它会打印“会话终止,正在杀死 shell... ...杀死。失败”。我必须这样做才能再次恢复我的 shell 提示。
  • 现在,当我运行service someprog status它时,它说它正在运行并列出它的 PID。我可以看到它,ps所以它正在运行。
  • 现在当我运行service someprog stop它无法停止。我可以验证它是否仍在运行ps

我需要更改什么才能someprog发送到后台并作为服务进行管理?

编辑:我现在发现了几个相关的问题,除了“做其他事情”之外,它们都没有实际答案:

编辑:这个关于双叉的答案可能已经解决了我的问题,但现在我的程序本身双叉并且有效:https : //stackoverflow.com/a/9646251/898699

top*_*gon -1

如果这是您的程序,请将其编写为适当的守护程序。特别是如果它是为了重新分配。:)

您可以尝试monit。或者可能是 runit 或 daemontools 之类的东西。那些强大的公司没有现成的软件包。Daemontools 来自 DJB,如果它影响您的决定(无论哪个方向)。