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 中的任何更改。