每 1445 分钟 Cronjob

每 1445 分钟 Cronjob

首先,抱歉我的英语不好。我是 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

相关内容