通过 upstart 运行短期任务

通过 upstart 运行短期任务

操作系统:Ubuntu 12.04

任务:在特定的启动/停止条件下运行脚本。不启动长期运行的服务/守护进程,仅启动短期操作。

Upstart 脚本 test.conf:

description     "test script"

start on local-filesystems or runlevel [2345]
stop on runlevel [!2345]

task

pre-start exec /full/path/to/script.sh start
pre-stop exec /full/path/to/script.sh stop

问题:

  1. 运行“启动测试”永远不会结束。如果我按 Ctrl-C 挂起 upstart,进一步的“状态”调用会显示服务正在运行。
  2. “停止测试”根本不会导致运行“预停止”节。

原始任务可以使用 upstart 脚本解决吗?

谢谢。

更新。“事实上,你的 script.sh 既有启动操作,也有停止操作,这确实表明守护进程正在长期运行”

不矛盾。有启动操作和清理操作,中间没有长时间运行的进程。

当我添加“exec”节时,即

exec /full/path/to/script.sh idle

结果是这样的:

$ start test
test stop/waiting

$ status test
test stop/waiting

$ stop test
stop: Unknown instance:

更正:节中提到的脚本使用“start”和“idle”参数执行,但没有使用“stop”参数执行。

答案1

您的 upstart 配置文件缺少execscript部分,并且您似乎只想使用预启动命令来启动,这是不正确的。根据 upstart 文档(http://upstart.ubuntu.com/getting-started.html):

所有作业文件都必须有一个 exec 或 script 节。这指定了将为该作业运行什么。

可以使用附加 shell 代码在 exec 或 script 指定的二进制文件或脚本之前或之后运行。这些代码不应启动进程,事实上,它们不能启动进程。它们用于准备环境并在之后进行清理。

此外,您最初的任务请求(“不启动任何长期运行的服务/守护进程,只执行短期操作。”)似乎与您script.sh同时具有startstop操作的事实相矛盾,这建议一个长期运行的守护进程。

description     "test script"

start on local-filesystems or runlevel [2345]
stop on runlevel [!2345]

task

# Assuming script.sh start starts, performs a process, and then exits,
# this should work
exec /full/path/to/script.sh start

# No need for a pre-stop

我链接到的 upstart 文档据说已被弃用,你也可以看看http://upstart.ubuntu.com/cookbook/它是一个很好的参考,并且有有用的例子,所以如果你仍然不清楚的话,我建议你阅读它。

相关内容