我正在运行一个测试脚本,其中在 800 个循环中,两个 crontab 脚本在 5 秒的时间内创建新的 crontab。
例如。
while [ "$counter" -lt 800 ]; do
crontab -r
create_crontab_1.sh >> cr_log.log
sleep 5;
create_crontab_2.sh>> cr_log.log
(( counter++ ))
done
现在
create_crontab_1.sh->
CRONLINE="*/2 * * * * /scratch/test1.sh >/dev/null 2>&1"
( crontab -l 2>/dev/null ; echo "${CRONLINE}" ) | crontab -
create_crontab_2.sh->
crontab cron_file.txt
cron_file.txt ->
* * * * * 睡眠 2; /scratch/test3.sh >/dev/null 2>&1
* * * * * 睡眠 3; /scratch/test4.sh >/dev/null 2>&1
/var/log/cron 日志:
crond[25583]: (用户名) RELOAD (/var/spool/cron/)
CROND[29339]: (root) CMD (sleep 3; /abc/test3.sh >/dev/null 2>&1)
CROND[29340] : (root) CMD (sleep 2; /abc/test4.sh >/dev/null 2>&1)
crontab[29345]: (用户名) LIST ()
CROND[29353]: (用户名) CMD (/abc/test1. sh >/dev/null 2>&1)
crontab[29365]: (用户名) REPLACE ()
即使带有 test1.sh 的 crontab 在 5 秒内被覆盖,为什么 test1.sh 出现在 cron 日志中,并且可以看到每 2 分钟调用一次(因为它计划每 2 分钟运行一次)?另外,它与CPU时钟有什么关系吗?
答案1
如果我们查看循环内的命令,并对它们进行一些重新排序,重复部分如下:
while ... do
create_crontab_2.sh >> cr_log.log
(( counter++ ))
crontab -r
create_crontab_1.sh >> cr_log.log
sleep 5;
done
create_crontab_2.sh
编辑 的操作将被crontab
以下操作撤消crontab -r
。create_crontab_1.sh
睡眠期间只有 crontab 中设置的内容存在。由于更改 crontab 的速度可能很快,因此不太可能cron
会看到create_crontab_2.sh
几乎所有设置的规则。