FreeBSD 7.3:服务正在运行,但状态显示“未运行”

FreeBSD 7.3:服务正在运行,但状态显示“未运行”

FreeBSD 7.3 上的一项服务出现问题:

1)它以命令“service my_secret_service start”开始,但后来如果我输入“service my_secret_service status” - 它显示为未运行。但在进程中,它存在于所有线程(python 线程)中(ps auwx | grep Secret_service),我可以看到它正在工作,因为服务日志、访问服务的 webui 等。

2)如果我输入“service my_secret_service stop”,它无法杀死主进程和所有线程。

我的秘密 rc 脚本:

#!/bin/sh                                                                                                                                                                                                   

# PROVIDE: sbdns_daemon

. /etc/rc.subr

CONFROOT=/usr/local/secret_group/secret_service/etc
export CONFROOT

name=secret_service_daemon
rcvar=`set_rcvar`
pidfile="/var/run/secret_service/${name}.pid"
logfile="${CONFROOT}/log.conf"

command_interpreter=/usr/bin/python
command="full path to python service file"
command_args="--logconf ${logfile} -d "
stop_postcmd="${name}_post_stop"

secret_service_daemon_post_stop()
{
    n=0 
    until [ $n -ge 3 ] 
    do  
        child_processes=$(check_alive_processes)
        if [ -z "$child_processes" ]
        then
            echo "All child processes were shutdown gracefully!"
            exit 0
        else
            if [ $n = 0 ] 
            then
                echo "Processes are still alive. Waiting for them to shutdown gracefully..."
            fi  
            n=$(($n+1))
            echo "Attempt $n/3, alive processes: $child_processes"
            sleep 5
        fi  
    done
    echo "Not all processes were terminated! Forcibly terminating child processes: $child_processes!"
    pkill -if "${command}"
}
check_alive_processes()
{
    echo "$(pgrep -if -d " " "${command}")"
}

chmod +x $command
load_rc_config "$name"

secret_service_daemon_enable=${secret_service_enable-NO}

echo "Enabled: ${secret_service_daemon_enable}"

run_rc_command "$1"

怎么了?

更新#1。看起来问题就出在 pidfile 的路径上,非常有趣。谢谢你!

答案1

当您使用该service命令时,将查找启动时设置的进程 ID (pid)。您的服务将其定义为:

pidfile="/var/run/secret_service/${name}.pid"

当您请求时,status将从此文件中提取 pid,并检查该进程是否正在运行。

如果您检查 I 的输出,ps我很确定您会发现正在运行的服务的进程 ID 与 pid 文件中的内容不匹配。

你的 rc 脚本看起来确实有点可疑。您确定要在 pidfile 路径中添加“secret_service”吗?如果是这样,请确保它在那里。

更常见的是:

pidfile="/var/run/${name}.pid"

BSD 中的实用 rc.d 脚本

相关内容