首先,抱歉我的英语不好。我是 Crontab 的新手,我正在制定一些计划。我用 Python 从互联网上抓取一些数据,我有这个网站,当你抓取一些数据时,你必须等待整整 24 小时才能获得下一部分数据,所以如果我的 cronjob 每天从 00.00 开始,它需要几秒钟来运行 Selenium 并抓取数据。第二天必须以几秒钟的偏移量运行,以确保从我进行抓取的那一刻起 24 小时,而不是从作业开始的那一刻起 24 小时。所以,有没有办法每天运行作业,比前一天延迟 5 分钟,或者我需要在 python 脚本中做一些每天睡眠时间更长的事情。
抱歉,帖子太长了
答案1
或者我需要在 Python 脚本中做一些事情,让它每天睡得更久一些。
可能是最简单的。cron 无法处理时间中的变量。at
当您需要启动脚本时,该命令会更加灵活。您需要的是一个执行
at midnight + 1 minute < {script}
1 是一个基于开始日期增加的变量(第 1 天为 +1 分钟,第 2 天为 +2 分钟,等等)。不过请注意,您在某些时候会遇到麻烦:在 60 * 24 = 1440 天内,您将运行到下一个午夜。将该脚本添加到您的 cron 中。
您还可以at -t
设置一个时间,使其成为不需要 cron 的正常命令:
at -t 201903300000
at -t 201903310001
at -t 201903010002
...
at -t 201912310410
(2019 年 3 月 30 日 0:00、3 月 31 日 0:00 1 分钟、4 月 1 日 0:00 2 分钟等)
答案2
实现目标的另一种可能方法是使用systemd 定时器单元 和服务单位代替计划任务。
文件/etc/systemd/system/my-script.timer
:
[Unit]
Description=Timer for MyScript
[Timer]
OnBootSec=2min
OnUnitInactiveSec=1day 5min
[Install]
WantedBy=multi-user.target
文件/etc/systemd/system/my-script.service
:
[Unit]
Description=MyScript
[Service]
Type=oneshot
ExecStart=/path/to/my-script.sh
然后运行以下命令:
sudo systemctl daemon-reload
sudo systemctl enable --now my-script.timer
这将启用(=启动时自动启动)计时器单元并立即启动它。
定时器单元控制服务单元,即:它在系统启动后 2 分钟启动同名的服务单元(my-script
),并从此在服务单元变为非活动状态(=已停止)后 1 天 5 分钟重新启动该服务单元。
如果开机时间已超过 2 分钟,则计时器会立即启动。
请注意,服务单元将以用户身份运行根。要改变这种情况,请将User=
属性添加到服务单元:
[Unit]
Description=MyScript
[Service]
Type=oneshot
User=djsony90
ExecStart=/path/to/my-script.sh
要检查状态,请发出:
systemctl status my-script.{timer,service}
● my-script.timer - Timer for MyScript
Loaded: loaded (/etc/systemd/system/my-script.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Sun 2019-03-31 13:47:29 CEST; 19min ago
Trigger: Mon 2019-04-01 13:52:59 CEST; 23h left
Mar 31 13:47:29 host systemd[1]: Started Timer for MyScript.
● my-script.service - MyScript
Loaded: loaded (/etc/systemd/system/my-script.service; static; vendor preset: enabled)
Active: inactive (dead) since Sun 2019-03-31 13:47:59 CEST; 18min ago
Process: 22833 ExecStart=/home/pduck/my-script.sh (code=exited, status=0/SUCCESS)
Main PID: 22833 (code=exited, status=0/SUCCESS)
Mar 31 13:47:29 host systemd[1]: Starting MyScript...
Mar 31 13:47:59 host systemd[1]: Started MyScript.
这里我们可以看到定时器单元已启用(意味着它将在启动时启动)并且当前正在等待 19 分钟。服务单元将在Mon 2019-04-01 13:52:59
大约 23 小时后激活。服务单元当前处于非活动状态。(我的测试脚本,,my-script.sh
只是做了一个sleep 30
。)我们还可以看到服务单元自 以来处于非活动状态Sun 2019-03-31 13:47:59
。加上 1 天 5 分钟就可以准确地得到Mon 2019-04-01 13:52:59
定时器单元的触发时间。
进一步阅读:
答案3
除了使用 cron 之外,您还可以简单地运行一个持久的 bash 脚本,该脚本在每次调用您的程序后都会休眠一天零十秒:
#/bin/bash
while true
do
### invoke your program here ###
sleep 1d 10s
done