我已经使用了at
一段时间了,我注意到at
作业 ID 似乎永远在增加。
$ atq
332 Mon Sep 23 17:25:00 2013 a cklein
$ # I'm up to 332 at jobs!
有趣的是,at
似乎没有保留有关已完成工作的数据。
$ at -c 331
Cannot find jobid 331
是否可以将此作业 ID 号重置回 0?
答案1
正如我们怀疑的那样,重新启动atd
服务并没有重置作业 ID:
例子
一些测试提交
$ at -f test.bash now
job 105 at Mon Sep 23 20:04:00 2013
$ at -f test.bash now
job 106 at Mon Sep 23 20:04:00 2013
仔细检查线轴目录
$ sudo ls -l /var/spool/at/spool/
total 0
重启atd
$ sudo /etc/init.d/atd restart 停止 atd: [ OK ] 启动 atd: [ OK ]
后续测试提交
$ at -f test.bash now
job 107 at Mon Sep 23 20:05:00 2013
$ at -f test.bash now
job 108 at Mon Sep 23 20:05:00 2013
深层发掘
atd
因此,如果您使用诸如此类的工具查看可执行文件,lsof
您会注意到以下内容:
$ sudo lsof | grep atd
atd 22341 root cwd DIR 253,0 4096 2103653 /var/spool/at
atd 22341 root rtd DIR 253,0 4096 2 /
atd 22341 root txt REG 253,0 24712 1192814 /usr/sbin/atd
atd 22341 root mem REG 253,0 57440 393478 /lib64/libnss_files-2.13.so
atd 22341 root mem REG 253,0 387352 393694 /lib64/libfreebl3.so
atd 22341 root mem REG 253,0 43304 393695 /lib64/libcrypt-2.13.so
atd 22341 root mem REG 253,0 99128 393328 /lib64/libaudit.so.1.0.0
atd 22341 root mem REG 253,0 22536 393671 /lib64/libdl-2.13.so
atd 22341 root mem REG 253,0 1956608 393664 /lib64/libc-2.13.so
atd 22341 root mem REG 253,0 13776 393333 /lib64/libpam_misc.so.0.82.0
atd 22341 root mem REG 253,0 55280 393331 /lib64/libpam.so.0.82.2
atd 22341 root mem REG 253,0 124592 393682 /lib64/libselinux.so.1
atd 22341 root mem REG 253,0 151456 393578 /lib64/ld-2.13.so
atd 22341 root 0u CHR 1,3 0t0 4066 /dev/null
atd 22341 root 1u CHR 1,3 0t0 4066 /dev/null
atd 22341 root 2u CHR 1,3 0t0 4066 /dev/null
atd 22341 root 3uW REG 253,0 6 1966556 /var/run/atd.pid
调查线轴目录。
所以没有任何文件打开,但有一个目录,/var/spool/at
所以让我们进一步调查一下:
$ sudo ls -la /var/spool/at/
total 20
drwx------. 3 daemon daemon 4096 Sep 23 20:42 .
drwxr-xr-x. 15 root root 4096 Aug 8 2011 ..
-rw-------. 1 daemon daemon 6 Sep 23 20:05 .SEQ
drwx------. 2 daemon daemon 4096 Sep 23 20:42 spool
答对了!这是我们正在寻找的东西,一个名为.SEQ
.更多文件显示了这一点:
$ sudo more .SEQ
0006c
我们可以让自己相信这是正确的值,用于bc
将其从十六进制转换为十进制:
$ echo "ibase=16; 0006C"|bc
108
一个实验
似乎将数字以十六进制形式输入此处。我们可以做一个小实验,将此值更改为 0。但首先停止服务atd
。
$ sudo /etc/init.d/atd stop
...edit file using vim, change it to 0...
$ sudo /etc/init.d/atd start
现在运行另一个测试at
:
$ at -f test.bash now
job 1 at Mon Sep 23 20:52:00 2013
并且数字已重新启动,我们又回到 1。如果我停止、编辑、再次启动并将值放回0006c
:
$ at -f test.bash now
job 109 at Mon Sep 23 20:53:00 2013
谜团已揭开。
关于其他发行版的说明
以上是在 Fedora 系统上进行的侦查,其他发行版(例如 Debian 和 Ubuntu)可能将该.SEQ
文件存储在完全不同的目录中。例如 Ubuntu 像这样存储文件:
$ sudo pwd
/var/spool/cron/atjobs
$ sudo ls -la
total 12
drwxrwx--T 2 daemon daemon 4096 Sep 23 21:19 .
drwxr-xr-x 5 root root 4096 Oct 17 2012 ..
-rw------- 1 daemon daemon 6 Sep 23 21:19 .SEQ