在 CentOS 5.4 中实现守护进程的简单方法

在 CentOS 5.4 中实现守护进程的简单方法

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

我正在开发一个 node.ja 应用程序,并且一直启动和停止它很麻烦,所以我想为其创建一个守护进程,使其易于启动和停止。

更新 1
我将给出一个关于该项目所需的小例子,希望有人能够帮助我。

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

# node /path-to-file/filename.js

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

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

我需要:

# killall -9 node

这将终止所有正在运行的节点应用程序

接下来我必须重新启动脚本

# node /path-to-file/filename.js

我只想输入

# myapp restart

一切都完成了。这种设置可以节省我很多时间

更新 2
我找到了一个叫 monit 的程序。这个程序很好用,在崩溃时会自动启动应用程序,这点很好。它还有一个不错的 Web 界面,也很方便。

我可以打字

# monit myapp start(start/stop/restart)

这很好用。只有一个缺点,而且这是一个主要缺点。当我启动 myapp 应用程序时,它不会显示 node.js 引发的编译错误。因此,当它启动失败时,我不知道原因是什么。我必须再次输入整个“# node /path-to-file/filename.js”来检查错误。

答案1

实际上,您不需要任何特殊的东西来创建守护进程。任何语言的任何程序都可以“守护”自身。或者,您可以使用小型 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

答案2

要在非交互会话中启动脚本,请使用nohup(它将在独立术语中分离您的进程)。

要使您的脚本可执行,请使用chmod ugoa+x <script_name>

最后一点,不要使用#!/bin/bash或,#!/bin/sh因为您不知道是否位于中/bin;请尝试使用#!/usr/bin/env bash(或sh),这会强制进程在 bash (sh) 环境下运行。请注意,env始终存在于中,/usr/bin并且已在其中注册所有环境(BASH、SH、TCSH...)路径。

答案3

如果你尝试守护一个没有守护进程模式的程序,那么你可以使用守护进程重新锻造存储库。

答案4

如果你需要运行一个输出到控制台的单个应用程序,但又不想让它垄断你的终端使用屏幕,那么请将其分离 - 输入屏幕,按回车键,正常启动你的应用程序,然后按 f6 退出。screen -r 返回到应用程序

相关内容