自定义守护进程脚本:有效,但不会在启动时运行

自定义守护进程脚本:有效,但不会在启动时运行

这是 Ubuntu 10.10 Maverick。

我在 init.d 中有一个以下 shell 脚本,我想在系统启动时将其作为“守护进程”(实际上是具有启动/停止/重新启动功能的后台服务)运行。rc3.d 中有一个符号链接。我也尝试了 4 和 5。(理想情况下,这会在图形登录发生之前和用户登录之前初始化。)

重要提示:测试时,脚本 100% 符合预期和要求服务 MetaLeapDaemon 启动服务 MetaLeapDaemon 停止(此 shell 脚本调用一个 Python 程序,确保在启动时创建适当的 .pid 文件并在退出时删除。)

所以一般来说它工作正常,但现在我唯一的问题是为什么它不会在我尝试的任何运行级别运行。我确信它没有运行,因为它通常创建的日志文件没有被创建。

正如您所看到的(由于 start-stop-daemon 命令中缺少任何 uid:gid 参数)这目前只能在 root 下运行,在默认设置中这是被禁止的吗?

这是脚本,实际上几乎就是您常用的守护进程脚本:

#! /bin/sh

DAEMON=/opt/metaleap/_core/daemon/MetaLeapDaemon.py
NAME=MetaLeapDaemon
DESC="MetaLeapDaemon"

test -f $DAEMON || exit 0

set -e

case "$1" in
    start)
        start-stop-daemon --start --pidfile /var/run/$NAME.pid --exec $DAEMON
        ;;
    stop)
        start-stop-daemon --stop --pidfile /var/run/$NAME.pid
        ;;
    restart)
        start-stop-daemon --stop --pidfile /var/run/$NAME.pid
        sleep 1
        start-stop-daemon --start --pidfile /var/run/$NAME.pid --exec $DAEMON
        ;;
    *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart}" >&2
        exit 1
        ;;
esac

exit 0

答案1

我回答这个问题是为了完整性,即使你已经从事了 Upstart 的工作(并且要走的路,我不是建议你在这里回去)......

我认为您第一次错过的关键是运行级别。我猜您习惯于 RPM 发行版,其中多用户通常使用运行级别 3,GUI 通常使用运行级别 5?

在 Debian 和 Ubuntu 中,实际上只有单用户 (1) 和多用户 (如果安装了 GUI)。多用户是运行级别 2。因此,您的符号链接失败,因为您从未到达 RL 3。

使用该update-rc.d命令可以更容易地管理符号链接。

无论如何,我写下这篇文章是为了那些可能真正需要它的人。不过我建议他们也把脚本转换成 Upstart!

答案2

使用以下命令在启动时启动脚本。

将其添加到启动应用程序。

sudo -u USERNAME COMMAND

顺便说一句,有人告诉我使用 NOPASSWORD,否则它将不起作用:

您最好运行 sudo visudo 来编辑 /etc/sudoers 文件并为命令添加 NOPASSWD,而不是在脚本中写入密码。– Lekensteyn

我希望这对你有帮助,

丹尼尔

相关内容