背景
我正在编写一个脚本,它偶尔会通过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命令的其他进程。
发布于 2019-03-08 15:36:20
在调度之前记录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正如所展示的,这是不可能完成的工作在你的领导下。当然,如果作业同时添加到单独的进程中,并且您想要排除这些任务,那么就需要一个不同的解决方案(可能是通过为提交作业的用户打招呼,或者让不同的进程提交到单独的at -q队列中)。
发布于 2019-03-08 15:33:42
您可以使用atq查看每个提交后的作业队列,并从最后一行的第一列中获取任何新提交的作业的作业ID。
https://stackoverflow.com/questions/55066250
复制相似问题