upstart 是否可以成为 anacron 的可靠替代品?

upstart 是否可以成为 anacron 的可靠替代品?

Upstart 常见问题解答说:

Upstart 会取代 cron、atd 或 anacron 吗?

是的。Upstart 的计划功能是能够在特定预定时间、定期预定时间或特定时间间隔生成事件。

但是,页面底部显示它是在 2009 年编写的。这些计划中的功能是否已经到位,并且使用 upstart 代替 anacron 是否切实可行?

另外,upstart 是否可以立即处理每个用户的任务(例如与 anacron 不同)?

答案1

从 Upstart 1.10 开始(用于 Ubuntu 13.10):

Upstart 当前文档位于http://upstart.ubuntu.com/cookbook

Cron 和 anacron 功能尚未在 Upstart 中实现。

参考:http://upstart.ubuntu.com/cookbook/#run-a-job-periodically

11.26 定期运行作业

目前 Upstart 无法直接处理此问题。不过,目前正在开发的“时间事件”功能将解决此问题。

在时间事件可用之前,您应该使用 cron(8),或者类似的东西:

 # /etc/init/timer.conf

 instance $JOB_TO_RUN

 script   for var in SLEEP JOB_TO_RUN   do
     eval val=\${$var}
     if [ -z "$val" ]
     then
       logger -t $0 "ERROR: variable $var not specified"
       exit 1
     fi   done

   eval _sleep=\${SLEEP}   eval _job=\${JOB_TO_RUN}

   while [ 1 ]   do
     stop  $_job || true
     sleep $_sleep
     start $_job || true   done end script

每个用户的任务可以指 1)以用户身份运行作业 [Upstart 会这样做] 或 2)发出和监听用户级事件而不是系统事件 [Upstart 也会这样做]

以用户身份运行作业的描述如下http://upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user

11.43.2 更改用户

有些守护进程一开始以超级用户身份运行,然后在内部安排将其权限级别降低到其他(权限较低的)用户。但是,有些守护进程不需要这样做:它们永远不需要 root 权限,因此可以以非 root 用户身份调用。

那么如何运行“系统作业”但又让它以非 root 用户身份运行呢?从 Upstart 1.4 开始,Upstart 可以使用 setuid 和 setgid 节以指定用户身份运行系统作业。

但是,如果您没有使用 Upstart 1.4,则可以轻松实现所需的目标。您可以使用几种方法。对于 Debian 和 Ubuntu 系统,建议的方法是使用辅助实用程序 start-stop-daemon(8),如下所示:

 exec start-stop-daemon --start -c myuser --exec command

使用 start-stop-daemon(8) 的优点是它只是更改运行命令的用户和组。与 su(1) 相比,这也有一个优势,即 su(1) 必须分叉才能保持其 PAM 会话打开,因此 upstart 更难跟踪,而 start-stop-daemon(8) 将在更改 uid/gid 后执行给定的命令。

另一个需要注意的潜在问题是 start-stop-daemon 不会对其启动的进程施加 PAM(“可插入式身份验证模块”)限制。可以使用适当的 Upstart 节设置此类限制,但您无法通过 PAM limits.conf(5) 指定限制。

当然,您可能希望实施 PAM 限制,在这种情况下您应该使用 su(1) 或 sudo(8),它们都链接到 PAM 库。

一般建议不要使用 su(1) 或 sudo(8),因为 PAM 限制确实不适合系统服务。例如,每次调用 su(1) 或 sudo(8) 时,PAM 都会生成一个 wtmp(5) 条目,而这些记录不适合系统服务。

如果您想使用 su(1) 或 sudo(8),下面的示例将向您展示如何使用。

使用 su(1):

 exec su -s /bin/sh -c command $user

请注意,尽管您可以将上述内容简化为以下内容,但不建议这样做,因为如果用户“$user”是系统帐户,并且将 shell 指定为 /bin/false,则作业将不会运行指定的命令:它将因 /bin/false 返回“1”而失败:

 exec su -c command $user

如果用户“$user”是系统帐户,并且其 shell 指定为 /bin/false,则该作业将默认失败。

为了避免因生成 shell 而导致的 fork(2),您可以改为指定:

 exec su -s /bin/sh -c 'exec "$0" "$@"' $user -- /path/to/command
 --arg1=foo -b wibble

如果您的工作是利用期望的服务工作,那么这种技术特别有用。

使用 sudo(8) 的基本示例:

 exec sudo -u $user command

用户级作业(称为“会话作业”)描述如下http://upstart.ubuntu.com/cookbook/#session-job

4.2.3 会话作业

从 Upstart v1.7 开始

会话作业类似于旧的用户作业。与旧的用户作业不同,会话作业不由作为 PID 1 运行的 Upstart 管理 - 它们由用户自己的会话初始化管理。

与 Upstart 以 PID 1 运行时不同,会话初始化可以从多个目录读取其作业配置文件。作业读取的目录列表如下(按顺序):

 $XDG_CONFIG_HOME/upstart/ (or $HOME/.config/upstart/ if $XDG_CONFIG_HOME not set).
 $HOME/.init/ (deprecated - supported for legacy User Jobs).
 $XDG_CONFIG_DIRS
 /usr/share/upstart/sessions/

当上述任何目录名被删除时,每个作业的名称将被视为基本名称。例如,如果作业配置文件以 $HOME/.config/upstart/hello/world.conf 的形式存在,则其名称将为“hello/world”,而如果作业配置文件以 /usr/share/upstart/sessions/foo/bar.conf 的形式存在,则其名称将为“foo/bar”。

Upstart 通过简单地接受它找到的第一个有效作业(或覆盖文件)来解决任何名称冲突。例如,如果存在以下两个文件:

 $HOME/.init/foo.conf $HOME/.config/upstart/foo.conf

仅第一个 $HOME/.init/foo.conf 会被使用。然而如果存在以下文件:

 $HOME/.init/foo.conf $HOME/.config/upstart/foo.conf
 $HOME/.config/upstart/foo.override

Upstart 将首先读取 $HOME/.init/foo.conf,然后应用 $HOME/.config/upstart/foo.override 中的任何更改。

相关内容