我正在编写一个脚本,该脚本偶尔通过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
命令来考虑其他进程。
答案 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。