FreeBSD 7.3: 서비스가 실행 중이지만 상태가 "실행되지 않음"으로 표시됩니다.

FreeBSD 7.3: 서비스가 실행 중이지만 상태가 "실행되지 않음"으로 표시됩니다.

FreeBSD 7.3의 서비스에 문제가 있습니다:

1) "service my_secret_service start" 명령으로 시작하지만 나중에 "service my_secret_service status"를 입력하면 실행되지 않는 것으로 표시됩니다. 하지만 그 과정에서 모든 스레드(파이썬 스레드)(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 스크립트

관련 정보