JeffProd Asked: 2021-09-20 01:33:48 +0800 CST2021-09-20 01:33:48 +0800 CST 2021-09-20 01:33:48 +0800 CST 如何每 64 小时运行一次脚本? 772 我需要每 64 小时运行一次脚本。我找不到答案cron。是否有可能,或者我应该在 shell 脚本中使用循环? scripting cron 5 个回答 Voted Stéphane Chazelas 2021-09-20T11:05:04+08:002021-09-20T11:05:04+08:00 只需每小时运行一次并检查自某个任意时刻(例如,Unix 纪元时间的时刻 0)以来的小时数是 64 的倍数: 0 * * * * t=$(date +\%s); [ "$(( (t / 3600) \% 64 ))" -eq 0 ] && your-command Best Answer polemon 2021-09-20T02:12:22+08:002021-09-20T02:12:22+08:00 如果您是初学者,我建议也许使用像crontab.guru这样的 crontab“前端”来弄清楚 crontab。 但是,与您的情况一样,小时设置仅允许 0 到 23 的值,因此您不能在此处使用 crontab。 相反,我建议使用at. 在你的情况下,我可能会使用类似的东西: at now + 64 hours 然后输入您的命令或 echo "<your command>" | at now + 64 hours 在脚本的开头等。基本上,您将安排在最后一次调用命令时立即运行命令。另外,如果您不想要时间增量,而不是确切的时间,我建议做一些时间算术,然后使用确切的时间at来运行命令。 我强烈建议阅读的手册页at,因为它相当全面。 FelixJN 2021-09-20T02:05:35+08:002021-09-20T02:05:35+08:00 cron用于在日期或时钟事件上运行事物,即分别在每月或每周的第一天或每天的第三小时运行。 对于不能简单地通过时钟时间或日期的算术表示的时间间隔运行的东西,我建议使用systemd计时器 - 当然,这只有在您systemd在各自的设备上运行时才有效。 您将需要两个文件,运行脚本的服务文件和管理事件的计时器文件。 $cat /etc/systemd/system/myscript.service [Unit] Description=this service runs my script [Service] ExecStart=/full/path/to/myscript.sh #[Install] #WantedBy=multi-user.target 该服务只执行脚本而不检查它是否成功或任何其他内容。可选择启用该服务,systemctl enable myscript.service这意味着它将在启动期间执行一次 - 我对此进行了注释,因为计时器将处理启动事件。您可以手动运行脚本systemctl start myscript.service。 $cat /etc/systemd/system/myscript.timer [Unit] Description=this timer runs myscript.service every 64h [Timer] OnBootSec=120 OnUnitActiveSec=64h [Install] WantedBy=timers.target 这是myscript.service自上次激活服务以来每 64 小时以及启动时间后两分钟运行一次的计时器(以确保系统处于服务运行的正确状态)。请注意,如果您重新启动/关闭电源,计时器将不会记住 64 小时。相应地启用并启动计时器: systemctl enable myscript.timer systemctl start myscript.timer 由于计时器仅在启动后或上次单元激活后启动,因此您必须运行一次服务以确保计时器运行: systemctl start myscript.service 通过以下方式检查计时器的状态 systemctl list-timers hobbs 2021-09-20T19:25:28+08:002021-09-20T19:25:28+08:00 64 小时是 2 又 2/3 天,所以 3 * 64 小时 = 192 小时 = 8 天。所以你几乎可以做到 0 0 1-25/8 * * foo 0 16 3-27/8 * * foo 0 8 6-30/8 * * foo 除了你在月底得到一个短模式(如果这个月有 30 天,那么在 30 日 08:00 的运行和 1 日 00:00 的运行之间只有 16 小时;如果当月有 31 天,则为 40 小时;如果该月有 28 天,则从 27 日 16:00 运行到 1 日 00:00 运行之间为 32 小时;如果该月有 29天,它将是 56 天),而且每当您所在的地区开始或结束夏季时(假设是这样),事情也会减少 1 小时。 不太符合您的规格(我赞同其他任何符合要求的答案),但这是一个有趣的练习。 Jeremy Boden 2021-09-23T11:06:21+08:002021-09-23T11:06:21+08:00 很惊讶没有人提到以下任何一个:- 安娜克龙 它是大多数发行版的标准配置。
只需每小时运行一次并检查自某个任意时刻(例如,Unix 纪元时间的时刻 0)以来的小时数是 64 的倍数:
如果您是初学者,我建议也许使用像crontab.guru这样的 crontab“前端”来弄清楚 crontab。
但是,与您的情况一样,小时设置仅允许 0 到 23 的值,因此您不能在此处使用 crontab。
相反,我建议使用
at
. 在你的情况下,我可能会使用类似的东西:然后输入您的命令或
在脚本的开头等。基本上,您将安排在最后一次调用命令时立即运行命令。另外,如果您不想要时间增量,而不是确切的时间,我建议做一些时间算术,然后使用确切的时间
at
来运行命令。我强烈建议阅读的手册页
at
,因为它相当全面。cron
用于在日期或时钟事件上运行事物,即分别在每月或每周的第一天或每天的第三小时运行。对于不能简单地通过时钟时间或日期的算术表示的时间间隔运行的东西,我建议使用
systemd
计时器 - 当然,这只有在您systemd
在各自的设备上运行时才有效。您将需要两个文件,运行脚本的服务文件和管理事件的计时器文件。
该服务只执行脚本而不检查它是否成功或任何其他内容。可选择启用该服务,
systemctl enable myscript.service
这意味着它将在启动期间执行一次 - 我对此进行了注释,因为计时器将处理启动事件。您可以手动运行脚本systemctl start myscript.service
。这是
myscript.service
自上次激活服务以来每 64 小时以及启动时间后两分钟运行一次的计时器(以确保系统处于服务运行的正确状态)。请注意,如果您重新启动/关闭电源,计时器将不会记住 64 小时。相应地启用并启动计时器:由于计时器仅在启动后或上次单元激活后启动,因此您必须运行一次服务以确保计时器运行:
通过以下方式检查计时器的状态
64 小时是 2 又 2/3 天,所以 3 * 64 小时 = 192 小时 = 8 天。所以你几乎可以做到
除了你在月底得到一个短模式(如果这个月有 30 天,那么在 30 日 08:00 的运行和 1 日 00:00 的运行之间只有 16 小时;如果当月有 31 天,则为 40 小时;如果该月有 28 天,则从 27 日 16:00 运行到 1 日 00:00 运行之间为 32 小时;如果该月有 29天,它将是 56 天),而且每当您所在的地区开始或结束夏季时(假设是这样),事情也会减少 1 小时。
不太符合您的规格(我赞同其他任何符合要求的答案),但这是一个有趣的练习。
很惊讶没有人提到以下任何一个:-
安娜克龙
它是大多数发行版的标准配置。