从“at”工作的非交互式排队获取工作号码

问题描述 投票:1回答:2

Background

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

echo "ls -la" > cmd.txt

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

at -f cmd.txt now + 2 min

Problem

我想以自动化,非交互式,确定性的方式;确定与我的脚本排队的任务相关联的作业号。不幸的是,返回代码中似乎没有提供任何内容(即echo $?),也没有提供我可以发出的CLI命令,它为我提供了这一点。我总是可以刮掉stdout数据,即:

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

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


Question

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


Edit

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

linux bash scheduled-tasks at-command
2个回答
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队列中)。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.