从 "at" 个作业的非交互式队列中获取作业编号

Get job number from non-interactive queuing of "at" job


背景

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

echo "ls -la" > cmd.txt

然后我将命令安排到 运行 2 分钟后通过:

at -f cmd.txt now + 2 min

问题

我想以一种自动化的、非交互式的、确定性的方式;确定与我的脚本刚刚排队的任务关联的作业编号。不幸的是,return 代码(即 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 数据更多 canonical/direct 的东西,因为我想避免 stdout 因平台而异的情况到下一个(即 Linux、BSD、OSX)。


问题

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


编辑

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

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

在调度前记录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 }' # completed jobs
3
$ comm -13 atq.1 atq.2 | awk '{print }' # added jobs
4

如前所述,这不受您手下完成的工作的影响。当然,如果同时在单独的进程中添加作业,并且您想排除这些作业,则需要使用不同的解决方案(可能通过 grepping 查找提交作业的用户,或者让不同的进程提交到单独的 at -q 队列中).