我正在编写一个脚本,偶尔会通过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
命令的其他进程。
在安排之前记录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
队列中)。
您可以使用atq
在每次提交后查看作业队列,并从任何新提交的作业的最后一行的第一列获取作业ID。