Peter Andres Asked: 2023-05-04 03:36:25 +0800 CST2023-05-04 03:36:25 +0800 CST 2023-05-04 03:36:25 +0800 CST 我可以使用 Linux crontab 以秒为单位指定特定时间吗? 772 49 18 * * * mpv ~/Musik/Donau.mp3 此命令将Donau.mp3在下午 6:49 播放文件。例如,我如何指定下午 6:49:50? linux 2 个回答 Voted Best Answer Gilles Quénot 2023-05-04T03:38:20+08:002023-05-04T03:38:20+08:00 使用systemd计时器: https: //wiki.archlinux.org/title/Systemd/Timers 您也可以指定秒数: OnCalendar=Mon,Tue *-*-01..04 18:49:50 或者像这样,'黑客' crontab: 49 18 * * * sleep 50; mpv ~/Musik/Donau.mp3 由于工作原理,不要指望后一种解决方案是精确的cron。 Austin Hemmelgarn 2023-05-04T19:50:14+08:002023-05-04T19:50:14+08:00 此命令将在下午 6:49 播放“Donau.mp3”文件。 不正好是下午 6:49,正好是下午 6:49。这是一个重要的区别,它实际上部分解释了为什么大多数 cron 实现不能做你想做的事情。 在高层次上,crond 实际做的是休眠大约 60 秒,然后检查需要运行哪些作业并启动它们,然后再次休眠大约 60 秒减去检查和启动作业所花费的时间。 然而,在类 UNIX 系统上用于将进程暂停一段时间的机制都没有考虑到确切的唤醒时间。它们只允许您指定唤醒时间的下限。例如,在 C 代码中,sleep(10);将休眠至少10 秒,但可能会休眠更长的时间(实际上,它几乎总是至少休眠一个调度量程比该时间长)。通常差异小于 200 毫秒,但如果系统负载很重或被唤醒的进程的优先级非常低,则完全有可能更长。 对于通常休眠 60 秒的 crond 情况,即使是几秒的抖动通常也是微不足道的,因为它可以调整下一个周期休眠多长时间来补偿。然而,如果它试图每秒运行一次,超过半秒的抖动就足以导致可靠性问题并可能错过事件。 这就提出了一个问题,为什么 systemd 允许您为定时器单位指定精确到秒的时间戳。现实情况是它实际上也没有达到那种精确度。Systemd 提供每秒分辨率,因为它以与 crond 根本不同的方式运行,systemd 不是检查每个周期以查找需要运行的作业,而是将计时器设置为在作业需要运行时被唤醒。在具有最小定时抖动的理想化系统上,这使其能够以该精度水平实际触发事物。但实际上,在繁忙的系统中,以这种精度安排的定时器单元延迟一两秒的情况并不少见。 我怎么能(例如)指定下午 6:49'50? 如果您确实需要那种精确度,那么正确的答案是无论您在做什么,都使用实时操作系统,而不是分时操作系统。 您可以在 Linux 系统上通过运行具有实时调度优先级的 crond 来接近这个,但是安全地这样做需要大量的努力来确保作业不会继承该优先级(这会带来很大的风险,它们会导致系统上运行的其他任何东西的问题),但这仍然不会让你选择精确到秒的时间来运行作业。
使用
systemd
计时器: https: //wiki.archlinux.org/title/Systemd/Timers您也可以指定秒数:
或者像这样,'黑客'
crontab
:由于工作原理,不要指望后一种解决方案是精确的
cron
。不正好是下午 6:49,正好是下午 6:49。这是一个重要的区别,它实际上部分解释了为什么大多数 cron 实现不能做你想做的事情。
在高层次上,crond 实际做的是休眠大约 60 秒,然后检查需要运行哪些作业并启动它们,然后再次休眠大约 60 秒减去检查和启动作业所花费的时间。
然而,在类 UNIX 系统上用于将进程暂停一段时间的机制都没有考虑到确切的唤醒时间。它们只允许您指定唤醒时间的下限。例如,在 C 代码中,
sleep(10);
将休眠至少10 秒,但可能会休眠更长的时间(实际上,它几乎总是至少休眠一个调度量程比该时间长)。通常差异小于 200 毫秒,但如果系统负载很重或被唤醒的进程的优先级非常低,则完全有可能更长。对于通常休眠 60 秒的 crond 情况,即使是几秒的抖动通常也是微不足道的,因为它可以调整下一个周期休眠多长时间来补偿。然而,如果它试图每秒运行一次,超过半秒的抖动就足以导致可靠性问题并可能错过事件。
这就提出了一个问题,为什么 systemd 允许您为定时器单位指定精确到秒的时间戳。现实情况是它实际上也没有达到那种精确度。Systemd 提供每秒分辨率,因为它以与 crond 根本不同的方式运行,systemd 不是检查每个周期以查找需要运行的作业,而是将计时器设置为在作业需要运行时被唤醒。在具有最小定时抖动的理想化系统上,这使其能够以该精度水平实际触发事物。但实际上,在繁忙的系统中,以这种精度安排的定时器单元延迟一两秒的情况并不少见。
如果您确实需要那种精确度,那么正确的答案是无论您在做什么,都使用实时操作系统,而不是分时操作系统。
您可以在 Linux 系统上通过运行具有实时调度优先级的 crond 来接近这个,但是安全地这样做需要大量的努力来确保作业不会继承该优先级(这会带来很大的风险,它们会导致系统上运行的其他任何东西的问题),但这仍然不会让你选择精确到秒的时间来运行作业。