2011-10-09 78 views
0

我有問題讓我自制的守護進程工作。這是在UbuntuLinux守護進程不分叉?

每當我打電話

服務mydaemon啓動

的守護程序啓動,但從來沒有我從來沒有控制權返回到控制檯。它就像過程不分叉或東西......

這是我在我的守護進程的開始時所做的。

pid_t pid; 
    //fork duplicates the current process 
    pid = fork(); 

    //The parent process should get a non-zero pid from fork 
    //The child process should get 0 
    if (pid < 0) //negative indicates error 
    { 
     cout << "Error starting Daemon."; 
     exit(EXIT_FAILURE); 
    } 
    else if (pid > 0) //parent process, exit success 
    { 
     cout << "Error starting Daemon. PID=" << pid; 
     exit(EXIT_SUCCESS); 
    } 

    //file permisions?? 
    umask(0); 

    //Child process set to new session so it is process group leader 
    pid_t sid = setsid(); 
    if(sid < 0) 
    { 
     exit(EXIT_FAILURE); 
    } 

    if(chdir("/") < 0) 
    { 
     exit(EXIT_FAILURE); 
    } 
    close(STDIN_FILENO); 
    close(STDOUT_FILENO); 
    close(STDERR_FILENO); 

這是我的inti.d守護進程配置文件。

#! /bin/sh 
### BEGIN INIT INFO 
# Provides:   skeleton 
# Required-Start: $remote_fs $syslog 
# Required-Stop:  $remote_fs $syslog 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: Example initscript 
# Description:  This file should be used to construct scripts to be 
#     placed in /etc/init.d. 
### END INIT INFO 

# Author: Foo Bar <[email protected]> 
# 
# Please remove the "Author" lines above and replace them 
# with your own name if you copy and modify this script. 

# Do NOT "set -e" 

# PATH should only include /usr/* if it runs after the mountnfs.sh script 
PATH=/sbin:/usr/sbin:/bin:/usr/bin 
DESC="my daemon" 
NAME=mydaemon 
DAEMON=/usr/sbin/$NAME 
DAEMON_ARGS="" 
PIDFILE=/var/run/$NAME.pid 
SCRIPTNAME=/etc/init.d/$NAME 

# Exit if the package is not installed 
[ -x "$DAEMON" ] || exit 0 

# Read configuration variable file if it is present 
[ -r /etc/default/$NAME ] && . /etc/default/$NAME 

# Load the VERBOSE setting and other rcS variables 
. /lib/init/vars.sh 

# Define LSB log_* functions. 
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present. 
. /lib/lsb/init-functions 

# 
# Function that starts the daemon/service 
# 
do_start() 
{ 
    for i in 0 1 2 3 4 5 
    do 
     if [ "$(pidof mysqld)" ] 
     then 
      sleep 2 
      break 
     else 
      sleep 2 
     fi 
    done 


    # Return 
    # 0 if daemon has been started 
    # 1 if daemon was already running 
    # 2 if daemon could not be started 
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ 
     || return 1 
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ 
     $DAEMON_ARGS \ 
     || return 2 
    # Add code here, if necessary, that waits for the process to be ready 
    # to handle requests from services started subsequently which depend 
    # on this one. As a last resort, sleep for some time. 
} 

# 
# Function that stops the daemon/service 
# 
do_stop() 
{ 
    # Return 
    # 0 if daemon has been stopped 
    # 1 if daemon was already stopped 
    # 2 if daemon could not be stopped 
    # other if a failure occurred 
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME 
    RETVAL="$?" 
    [ "$RETVAL" = 2 ] && return 2 

    # Wait for children to finish too if this is a daemon that forks 
    # and if the daemon is only ever run from this initscript. 
    # If the above conditions are not satisfied then add some other code 
    # that waits for the process to drop all resources that could be 
    # needed by services started subsequently. A last resort is to 
    # sleep for some time. 
    start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON 
    [ "$?" = 2 ] && return 2 
    # Many daemons don't delete their pidfiles when they exit. 
    rm -f $PIDFILE 
    return "$RETVAL" 
} 

# 
# Function that sends a SIGHUP to the daemon/service 
# 
do_reload() { 
    # 
    # If the daemon can reload its configuration without 
    # restarting (for example, when it is sent a SIGHUP), 
    # then implement that here. 
    # 
    start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME 
    return 0 
} 

case "$1" in 
    start) 
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" 
    do_start 
    case "$?" in 
     0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 
     2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 
    esac 
    ;; 
    stop) 
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" 
    do_stop 
    case "$?" in 
     0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 
     2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 
    esac 
    ;; 
    status) 
     status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? 
     ;; 
    #reload|force-reload) 
    # 
    # If do_reload() is not implemented then leave this commented out 
    # and leave 'force-reload' as an alias for 'restart'. 
    # 
    #log_daemon_msg "Reloading $DESC" "$NAME" 
    #do_reload 
    #log_end_msg $? 
    #;; 
    restart|force-reload) 
    # 
    # If the "reload" option is implemented then remove the 
    # 'force-reload' alias 
    # 
    log_daemon_msg "Restarting $DESC" "$NAME" 
    do_stop 
    case "$?" in 
     0|1) 
     do_start 
     case "$?" in 
      0) log_end_msg 0 ;; 
      1) log_end_msg 1 ;; # Old process is still running 
      *) log_end_msg 1 ;; # Failed to start 
     esac 
     ;; 
     *) 
     # Failed to stop 
     log_end_msg 1 
     ;; 
    esac 
    ;; 
    *) 
    #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 
    echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 
    exit 3 
    ;; 
esac 

: 
+1

與您需要將此降低到儘可能小的例子,其中它不工作。 – sjr

+0

您可以將'-v'標誌添加到'start-stop-daemon'幷包含輸出嗎?在調試問題時,使用'--quiet'運行並不是很有用。 –

回答

0

這個工作對我來說:

開始)
回聲 「啓動$ NAME」
啓動 - 停止 - 守護--start -m --quiet -b --pidfile $ PIDFILE --exec $ DAEMON >> $ LOG ||出口1
;;
stop)
echo「Stopping $ NAME」
start-stop-daemon --stop --pidfile $ PIDFILE ||出口1
;;;

不能得到記錄與上述的工作,但是這給start-stop-daemon的