如何使用systemd替换每五分钟运行一次的cron作业?

时间:2017-01-10 03:49:55

标签: cron systemd periodic-task

我们有一个嵌入式目标环境(与主机构建环境不同)import tensorflow as tf import numpy as np a = tf.placeholder(tf.int32, shape=[None, 5]) r, c = a.get_shape() x_split = tf.split(1, c, a) # split a along axis 1 last_col = x_split[-1] mask = tf.greater(last_col, tf.constant(6)) cond = tf.where(mask, tf.add(last_col, tf.constant(1)), # if true, add one tf.add(last_col, tf.constant(-1)))# if false, minus one x_split = x_split[0:-1] x_split.append(cond) ans = tf.concat(1, x_split) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]) the_ans = sess.run(ans, feed_dict={a: arr}) ''' the_ans is [[ 1 2 3 4 4] [ 6 7 8 9 11]] ''' 正在运行但不是systemd

我们还有一个脚本,在大多数系统中,我只需创建一个cron条目,每五分钟运行一次。

现在我知道如何在cron下创建一个服务,但这个脚本是在完成其工作后退出的一次性脚本。我想做的是让它在启动时立即运行(当然在systemd之后)然后每隔五分钟运行一次。

在阅读syslog.target计时器后,我创建了以下服务文件systemd

/lib/systemd/system/xyzzy.service

和等效的[Unit] Description=XYZZY After=syslog.target [Service] Type=simple ExecStart=/usr/bin/xyzzy.dash

/lib/systemd/system/xyzzy.timer

不幸的是,在启动目标时,计时器似乎没有启动,因为[Unit] Description=XYZZY scheduler [Timer] OnBootSec=0min OnUnitActiveSec=5min [Install] WantedBy=multi-user.target 的输出不包含它。手动启动计时器单元似乎工作正常,但这应该是在用户干预的情况下自动运行的。

我原以为systemctl list-timers --all会确保计时器单元已经安装并运行,因此会定期启动服务。但是,我注意到WantedBy目录实际上没有计时器的符号链接。

如何在multi-user.target.wants完成?

1 个答案:

答案 0 :(得分:1)

在您实际启用它之前,计时器不会处于活动状态:

systemctl enable xyzzy.timer

如果您想在重新启动之前查看其工作原理,您也可以启动它:

systemctl start xyzzy.timer

对于单独的目标环境而言,在启动时您无法轻松运行任意命令(但可能会控制文件系统内容),您可以只需在enable命令中创建相同的符号链接(在您的开发区域中)。

例如(假设SYSROOT标识目标文件系统的根目录):

ln -s ${SYSROOT}/lib/systemd/system/xyzzy.timer
      ${SYSROOT}/lib/systemd/system/multi-user.target.wants/xyzzy.timer 

这将有效地将计时器单元置于multi-user.target的启用状态,因此systemd将以该目标启动它。

此外,通常您的自定义文件将存储在/etc/systemd/system/中。等效的lib目录用于托管由软件包或操作系统安装的systemd文件。

如果您的cron作业每5分钟精确非常重要,那么您应该检查准确性,因为systemd's monotonic timers can slip over time