在 CentOS 5.4 中简单的守护进程

Sai*_*han 2 linux centos shell daemon

我知道有一个名为 upstart 的程序可以轻松制作小型守护程序。我无法在 CentOS 上配置此程序。我收到各种有关 pkg-congfig、libnih 和 dbus 的错误。

我正在开发一个 node.ja 应用程序,启动和停止一直很痛苦,所以我想为此创建一个守护进程,它可以轻松启动和停止。

更新 1
我将举一个我需要这个项目的小例子,我希望有人可以帮助解决这个问题。

要启动 node.js 应用程序,我必须输入 SSH:

# node /path-to-file/filename.js
Run Code Online (Sandbox Code Playgroud)

现在,当我执行此终端冻结时,我必须按 CTRL + Z (pc) 才能返回输入。

现在,当我更改文件中的某些内容时,我必须再次重新加载它

我需要:

# killall -9 node
Run Code Online (Sandbox Code Playgroud)

这会杀死所有正在运行的节点应用程序

接下来我必须再次启动脚本

# node /path-to-file/filename.js
Run Code Online (Sandbox Code Playgroud)

我只想打字

# myapp restart
Run Code Online (Sandbox Code Playgroud)

一切都完成了。这种类型的设置会为我节省很多时间

更新 2
我找到了一个名为 monit 的程序。这很好用,并且在崩溃时自动启动应用程序,这很好。它还有一个很好的网络界面,也很方便。

我可以打字

# monit myapp start(start/stop/restart)
Run Code Online (Sandbox Code Playgroud)

这工作正常。只有一个缺点,这是一个主要的缺点。当我启动 myapp 应用程序时,它不显示 node.js 引发的编译错误。所以当它无法启动时,我不知道是什么原因。我必须再次键入整个 '# node /path-to-file/filename.js' 以检查错误。

waz*_*oox 10

你不需要任何特别的东西来制作一个守护进程,真的。任何语言的任何程序都可以“守护”自身。或者,您可以使用一个小的 shell 脚本包装器来守护现有的程序(例如 /etc/init.d 程序启动器可以处理它)。

通常,守护程序具有以下属性:

  • 工作目录必须是 /
  • STDIN 必须是 /dev/null
  • STDOUT 和 STDERR 必须是 /dev/null 或日志文件
  • 父 ID 应该是 init ( 1 ),通过分叉然后让父退出很容易实现。

更新 1

Monit 基本上处理了我在这里给出的血腥细节。有关 STDIN/STDOUT、/dev/null 等的详细信息,这些是基本的 Unix 概念,因此我想您迟早需要深入研究。例如参见这个Unix 介绍

更新 2

守护程序的 shell 脚本如下所示。请注意,这不适用于留在前台的程序。

#!/bin/sh

DAEMON=/some/program/to/run
PARAMETERS="parameters to my program"
LOGFILE=/var/log/somefile.log

start() {
    echo -n "starting up $DAEMON"
    RUN=`cd / && $DAEMON $PARAMETERS > $LOGFILE 2>&1`

    if [ "$?" -eq 0 ]; then
        echo "Done."
    else
        echo "FAILED."
    fi
}

stop() {
    killall $DAEMON
}

status() {
    killall -0 $DAEMON

    if [ "$?" -eq 0 ]; then
        echo "Running."
    else
        echo "Not Running."
    fi
}

case "$1" in
    start)
    start
    ;;

    restart)
    stop
    sleep 2
    start
    ;;

    stop)
    stop
    ;;

    status)
    status
    ;;

    *)
    echo "usage : $0 start|restart|stop|status"
    ;;
esac

exit 0
Run Code Online (Sandbox Code Playgroud)