我有一个脚本,我想在一天中定期运行(11:05 16:05 和 22:05)。但我不想整天都开着电脑,所以我尝试了一个脚本sudo crontab-e这里建议。
0 10 * * * sudo rtcwake -m disk -l -t $(date +%s --date '11:00')
问题是,它只在终端中运行才有效,而不是在 cronjob 中运行。我也试过sudo /usr/sbin/rtcwake xxxx在 cronjob 中没有运气。
但是,当计算机从手动 rtcwake-call 唤醒并运行我的脚本时,出现了第二个问题。系统时间发生了变化,导致系统时间相差两个小时。因此,我不得不添加第二个 cronjob 来修复计算机再次启动的时间
1 11 * * * sudo hwclock -w
如您所见,它在计算机从第一个 rtcwake 调用唤醒后一分钟运行,首先将其置于睡眠状态。我仍然不确定它是否有效,因为我还没有尝试过。(BIOS 的时间为 09:00,而计算机在唤醒后为 11:00)
但第三个问题出现了。当我运行 rtcwakeup-call 并尝试手动运行脚本时,由于没有网络连接,脚本无法运行。
所以我手动做了
sudo service network-manager restart
并尝试了脚本。成功了!
我的问题是,我该如何让整个事情顺利进行?当计算机全天候运行时,脚本可以正常运行,因为有互联网连接,并且时间与系统时间和操作系统时间同步。
该脚本在 Xubuntu 16 LTS 计算机上运行。也许它的设置与其他发行版不同。
如果我运行 sudo hwclock,它会显示时间为 15:20,就像角落里的时钟一样。但是当我执行 rtcwake 时
sudo rtcwake -m disk -l -t $(date +%s --date '16:25')
它响应说计算机将在 18:25 唤醒。当 rtcwake 中的计时器关闭 2 小时时,如何让 hwclock 和 xubuntu 时钟同步?如何将 hwclock 与 rtcwake 同步?(此问题已通过 *sudo hwclock --systohc --localtime 解决)
需要什么:
cronjob-定期运行我的脚本(从互联网收集数据)
cronjob2 - 即使用户或管理员未登录,也让计算机进入睡眠状态
cronjob3 - 当计算机唤醒时调整时间,以便第一个脚本(cronjob)在预定的时间运行,而不是两个小时后运行
cronjob4 - 在(cronjob)运行之前重新启动网络,以便它具有新的互联网连接
答案1
解决方案是调整 cron 中的命令
来自(不带反斜杠 %s):
sudo rtcwake -m disk -l -t $(date +%s --date '16:25')
收件人(带反斜杠 %s):
sudo rtcwake -m disk -l -t $(date +\%s --date '16:25')
每次唤醒后,我还会运行时间同步 cron-job,它在唤醒时间后大约 3 分钟运行。在此期间,操作系统时间将从滞后两个小时跳转到正确时间。此后,硬件时钟可以与操作系统时间同步。如果同步得太快,它将及时同步,并破坏依赖于正确时间的其余脚本:
sudo hwclock --systohc --localtime
后者确保 BIOS 时钟和本地时间相同。否则,当计算机休眠时,内部电池时钟独立于处于静止状态的处理器移动时,它们将相互漂移。
为了确保时间同步有效,我设置了运行 cron 时间同步的正确时间以及我的计算机延迟间隔的两个小时。这意味着如果我希望时间同步在 18:55 开始,我还会输入 16:55,这样即使硬件时钟与操作系统时钟不同步,它也会运行
55 16,18 * * * hwclock --systohc --localtime
您必须监控自己的系统,以查看出现哪些差异。如果它出现偏差,只需多花一些时间来同步。也许每小时一次。当计算机处于睡眠状态时,不会执行任何操作,但当它处于唤醒状态时,它将每小时同步一次时间。