我知道有一个名为 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 返回到应用程序