1

所以我为守护进程编写了 Arch Linux rc.d 脚本mongod(如下示例),但是当我这样做时:

sudo rc.d start mongod

它只是卡在:

:: Starting /usr/bin/mongod          [BUSY]

并且永远不会过渡到“完成”阶段。有小费吗?

这是我的脚本:

#!/bin/bash

# import predefined functions
. /etc/rc.conf
. /etc/rc.d/functions

# Point to the binary
DAEMON=/usr/bin/mongod

# Get the ARGS from the conf
. /etc/conf.d/crond

# Function to get the process id
PID=$(get_pid $DAEMON)

case "$1" in
   start)
    stat_busy "Starting $DAEMON"
    # Check the PID exists - and if it does (returns 0) - do no run
    [ -z "$PID" ] && $DAEMON $ARGS &> /dev/null
    if [ $? = 0 ]; then
        add_daemon $DAEMON
        stat_done
    else
        stat_fail
        exit 1
    fi
    ;;
   stop)
        stat_busy "Stopping $DAEMON"
    kill -HUP $PID &>/dev/null

    rm_daemon $DAEMON
    stat_done
    ;;
   restart)
        $0 stop
    sleep 1
    $0 start
    ;;
    *)
        echo "usage: $0 {start|stop|restart}"
esac

我已经看过 apache 是如何做到的,但我不知道他们在做什么不同。这是他们的一段httpd脚本:

case "$1" in
  start)
    stat_busy "Starting Apache Web Server"
    [ ! -d /var/run/httpd ] && install -d /var/run/httpd
    if $APACHECTL start >/dev/null ; then
      add_daemon $daemon_name
      stat_done
    else
      stat_fail
      exit 1
    fi
    ;;
4

1 回答 1

1

一方面,您传递了一个从未实际定义过的 $ARGS 变量。您可能想要传递一些配置选项,或者使用 -f 或 --config 选项传递 mongodb.conf 文件的位置,以告知守护进程您的数据库、日志文件、IP 绑定等的位置。

mongod 默认假设您的数据库位置是 /data/db/。如果这不存在,或者守护程序没有对该位置的权限,则 init 脚本将失败。

您可能还应该使用您自己或 root 以外的用户帐户运行守护程序(默认 pacman 包创建一个名为 mongodb 的用户),并授予该用户对数据路径和日志文件的读/写访问权限。

[ -z "$PID" ] && /bin/su mongodb -c "/usr/bin/mongod --config /etc/mongodb.conf --fork" > /dev/null

我建议参考Arch 社区包中提供的mongodb 初始化脚本,并将其与您在此处的内容进行比较。或者,使用 pacman 安装 MongoDB,它会为您设置所有这些。

如果一切都失败了,请在ifelse块中添加一些“echo”命令,以准确跟踪 init 脚本挂起的位置,检查 mongodb 的日志,并向我们报告。

于 2012-08-05T00:23:05.640 回答