这是 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
我希望这对你有帮助,
丹尼尔