atd
我在 OracleLinux 7 服务器上安排了一项一次性工作。但是,在系统时钟超过预定时间后,它仍然在队列中。
# atq
2 Mon Mar 14 00:00:00 2022 a root
# date
Mon Mar 14 09:38:15 NZDT 2022
服务atd
正在运行:
# systemctl status atd -l
● atd.service - After the Deadline Spell Check Service
Loaded: loaded (/etc/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-02-08 11:16:33 NZDT; 1 months 3 days ago
Process: 1259 ExecStart=/opt/atd/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 1270 (sh)
CGroup: /system.slice/atd.service
├─1270 /bin/sh ./run.sh
└─1283 java -server -Datd.lowmem=true -Dsleep.pattern_cache_size=8192 -Dbind.interface=127.0.0.1 -Dserver.port=1049 -Xmx3840M -XX:ParallelGCThreads=8 -XX:+AggressiveHeap -XX:+UseParallelGC -Dsleep.classpath=./lib:./service/code -Dsleep.debug=24 -classpath ./lib/* httpd.Moconti atdconfig.sl
该作业只是使用内置命令更改一些文件,并且在其他服务器上成功执行。
我还尝试检查命令是否被卡住,但我找不到任何正在运行的进程。所以我可以断定,atd
工作还没有开始!
在 下/var/spool/cron/root
,有一个名为 的文件a0000201a2e594
。基于此线程:https://stackoverflow.com/questions/4304631/rescheduling-an-at-job我们可以通过将最后 8 位数字转换为人类可读的时间来获得时间戳。所以https://www.epochconverter.com/告诉我该作业将在我的时区 2022 年 3 月 13 日 20:51:41 执行?与我定义的时间不符,但肯定是超过了时间表。
为什么这个盒子上无法完成这项工作?
答案1
奇怪的是,我发现了atd
服务调用/opt/atd/startup.sh
脚本,深入研究该脚本后,发现它只是一个java脚本。
我手动运行/usr/sbin/atd
,我注意到排队的作业已被处理。
我还发现/var/run/atd.pid
必须存在才能证明atd
守护进程正在运行。
所以,这个问题是由于有人修改了 systemctl 服务并“假装”该服务atd
正在运行而引起的!