자식 프로세스를 종료하기 위해 start-stop-daemon을 사용하는 방법은 무엇입니까?

자식 프로세스를 종료하기 위해 start-stop-daemon을 사용하는 방법은 무엇입니까?

저는 ncbash를 사용하여 간단한 웹 서버를 작성하고 있습니다. 다음과 같습니다.

#!/bin/bash
rm -f /var/run/streamman/out
mkfifo /var/run/streamman/out
trap "rm -f /var/run/streamman/out" EXIT

while true
do
    cat /var/run/streamman/out | nc -l 8080 > >( # parse the netcat output, to build the answer redirected to the pipe "out".
    while read line
    do
      line=$(echo "$line" | tr -d '[\r\n]')
      if echo "$line" | grep -qE '^GET /\?action' # if line starts with "GET /"
      then
        action=$(echo "$line" | cut -d '=' -f2 | cut -d ' ' -f1 | cut -d '&' -f1) # extract the request
        query_str=$(echo "$line" | cut -d '&' -f 2-)
        args=$(query_string_to_args $query_str)

        fn_exists $action && eval ${action} ${args} || echo "No route for $action"  
      elif [ "x$line" = x ] # empty line / end of request
      then
            header=$(cat /var/www/header.html)
            footer=$(cat /var/www/footer.html)
            echo  "$header somecontent $footer" > /var/run/streamman/out
      fi
    done
  )
done

몇 가지 추가 기능이 있지만 간결성을 위해 생략했습니다.

다음 init스크립트를 사용하여 데몬으로 시작합니다.

#!/bin/bash
user=streamman
name=streamman-httpd
prog=/usr/sbin/streamman-httpd

case $1 in
    start)
        start-stop-daemon --start --user $user --chuid $user --background --umask 0000 --exec $prog > /var/log/streamman/streamman.log 2>&1
        ;;
    stop)
        /sbin/start-stop-daemon --stop --user "$user" --name "$name" --retry=TERM/5/KILL/1
        ;;
    restart)
        ;;
    *)
        ;;
esac

ps afx서비스를 시작한 후의 출력은 다음과 같습니다.

3023 ?        S      0:00 /bin/bash /usr/sbin/streamman-httpd
3065 ?        S      0:00  \_ nc -l 8080
3066 ?        S      0:00      \_ /bin/bash /usr/sbin/streamman-httpd

보시다시피 어떤 이유로 하위 프로세스가 시작되었습니다. 나는 그것이 내가 그것을 사용하고 파이프라는 이름을 붙인 방식과 관련이 있다고 생각합니다 nc.

이제 서비스를 중지하려고 하면 다음과 같은 메시지가 나타납니다.

Program streamman-httpd, 1 process(es), refused to die.

출력 ps afx:

3065 ?        S      0:00 nc -l 8080
3066 ?        Z      0:00  \_ [streamman-httpd] <defunct>

어떤 이유로 하위 프로세스가 종료되지 않습니다.

pid 파일을 사용해 보았으나 서버 스크립트를 출력할 수 없습니다.아이들의pid를 파일에 추가합니다.

두 프로세스를 모두 종료하려면 어떻게 해야 합니까?

답변1

주된 이유는 "start" 섹션의 "exec" 호출 때문이라고 생각합니다. trap "rm -f /var/run/streamman/out" EXIT문자열에 다음과 같은 것을 추가 할 수 있나요 ?

; ps ax | kill `awk '$5 ~ /nc -l 8080/ {print $1}`

나는 이것이 더러운 해결 방법이라는 것을 알고 있습니다 ...

관련 정보