Bash rc.d启动不终止?

Bash rc.d启动不终止?,bash,daemon,archlinux,Bash,Daemon,Archlinux,因此,我为mongod守护进程编写了Arch-Linux-rc.d脚本(如下),但当我这样做时: sudo rc.d start mongod 它只是被卡住了: :: Starting /usr/bin/mongod [BUSY] 永远不要过渡到“完成”阶段。有什么建议吗 这是我的剧本: #!/bin/bash # import predefined functions . /etc/rc.conf . /etc/rc.d/functions # Point to th

因此,我为
mongod
守护进程编写了Arch-Linux-rc.d脚本(如下),但当我这样做时:

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
    ;;

首先,您正在传递一个从未实际定义的$ARGS变量。您可能希望使用-f或--config选项传递一些或一个的位置,以通知守护进程您的数据库、日志文件、IP绑定等的位置

mongod默认值假定您的数据库位置为/data/db/。如果该位置不存在,或者守护进程没有访问该位置的权限,则初始化脚本将失败

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

[ -z "$PID" ] && /bin/su mongodb -c "/usr/bin/mongod --config /etc/mongodb.conf --fork" > /dev/null
我建议参考中提供的,并将其与这里的进行比较。或者,使用pacman安装MongoDB,这为您设置了所有这些


如果所有其他操作都失败,请在If和else块中添加一些“echo”命令,以准确跟踪init脚本挂起的位置,检查mongodb的日志,并向我们报告。

首先,您传递的是一个从未实际定义的$ARGS变量。您可能希望使用-f或--config选项传递一些或一个的位置,以通知守护进程您的数据库、日志文件、IP绑定等的位置

mongod默认值假定您的数据库位置为/data/db/。如果该位置不存在,或者守护进程没有访问该位置的权限,则初始化脚本将失败

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

[ -z "$PID" ] && /bin/su mongodb -c "/usr/bin/mongod --config /etc/mongodb.conf --fork" > /dev/null
我建议参考中提供的,并将其与这里的进行比较。或者,使用pacman安装MongoDB,这为您设置了所有这些


如果所有其他操作都失败,请在If和else块中添加一些“echo”命令,以准确跟踪init脚本挂起的位置,检查mongodb的日志,并向我们报告。

这行代码:
[-z“$PID”]&&&$DAEMON$ARGS&>/dev/null
是否实际返回(即
mongod
本身是否正确)或者您需要在该行末尾添加一个
&
?您可以将
-x
添加到
#/bin/bash
行来跟踪脚本进度并查看停止的位置…遗憾的是,它永远不会返回。。。我将尝试添加
&
添加
&
效果良好,但它仍会偶尔向终端输出输出(不过关闭终端窗口也可以)。干杯您不使用pacman安装的有什么特殊原因吗?您自己编译过MongoDB吗?这一行:
[-z“$PID”]&&&$DAEMON$ARGS&>/dev/null
是否实际返回(即
mongod
本身是否正确地作为背景),或者您是否需要在该行末尾添加
&
?您可以将
-x
添加到
#/bin/bash
行来跟踪脚本进度并查看停止的位置…遗憾的是,它永远不会返回。。。我将尝试添加
&
添加
&
效果良好,但它仍会偶尔向终端输出输出(不过关闭终端窗口也可以)。干杯您不使用pacman安装的有什么特殊原因吗?你自己编译MongoDB了吗?没有看到arch包。或者也许它不起作用。无论如何,我会试着向你汇报。但是剧本看起来很棒,谢谢@drozzy作为将来的参考,您可以使用
pacman-Ss[关键字]
搜索Arch存储库。这还会告诉您是否已经安装了软件包。除非您有特殊需要,否则不应该在Arch上手动编译/安装MongoDB;而且软件包一直都是最新的。没有看到arch软件包。或者也许它不起作用。无论如何,我会试着向你汇报。但是剧本看起来很棒,谢谢@drozzy作为将来的参考,您可以使用
pacman-Ss[关键字]
搜索Arch存储库。这还会告诉您是否已经安装了软件包。除非您有特殊需要,否则不应该在Arch上手动编译/安装MongoDB;而且包裹始终保持最新。