从“在”工作的非交互排队中获取工作编号

时间:2019-03-08 15:24:40

标签: linux bash scheduled-tasks at-command


背景

我正在编写一个脚本,该脚本偶尔通过at命令排队。为了以一种自动化的,非交互的方式完成此任务,我echo将要执行到文件的命令,即:

echo "ls -la" > cmd.txt

然后我安排命令在2分钟后通过以下方式运行:

at -f cmd.txt now + 2 min

问题

我想以一种自动化,非交互性,确定性的方式;确定与我的脚本刚刚排队的任务相关的作业编号。不幸的是,返回代码(即echo $?)中似乎没有提供任何东西,也没有我可以发出的CLI命令可以提供此功能。我总是可以抓取stdout数据,即:

$> A=$(at -f cmd.txt now + 1 min)
warning: commands will be executed using /bin/sh
job 6 at Fri Mar 8 07:18:00 2019

但是,如果可能的话,我想使用比解析stdout数据更规范/更直接的方法,因为我想避免stdout从一个平台到另一个平台变化的情况(例如Linux,BSD,OSX)。


问题

如何直接获取我的脚本刚刚排队的at职位的职位编号(在脚本中)?


编辑

我还必须同时使用at命令来考虑其他进程。

2 个答案:

答案 0 :(得分:1)

在调度之前记录at队列状态,调度您的作业,然后查找其他内容:

$ date
Fri Mar  8 10:33:34 EST 2019
$ atq
3   2019-03-08 10:34 a bishop
$ atq > atq.1
$ echo "ls -l" > cmd.txt
$ at -f cmd.txt now + 2 min
job 4 at 2019-03-08 10:36
You have new mail in /var/spool/mail/bishop
$ atq > atq.2
$ comm atq.1 atq.2
3   2019-03-08 10:34 a bishop
    4   2019-03-08 10:36 a bishop
$ comm -23 atq.1 atq.2 | awk '{print $1}' # completed jobs
3
$ comm -13 atq.1 atq.2 | awk '{print $1}' # added jobs
4

如所示,这对您完成的工作没有影响。当然,如果同时将作业添加到单独的进程中,并且您想排除这些作业,则需要使用不同的解决方案(也许通过grepping提交作业的用户,或将不同的进程提交到单独的at -q队列中) )。

答案 1 :(得分:0)

您可以使用atq查看每次提交后的作业队列,并从任何新提交的作业的最后一行的第一列中获取作业ID。