是否有一个睡眠命令可以使用实际日期时间并忽略暂停?
echo a;sleep 3600;echo b
我工作10分钟,暂停笔记本2小时。当我从挂起状态唤醒它时,“b”只会在 50 分钟后打印,而不是立即打印。
另一种选择是
nA=`date +%s`;nB=$((nA+3600))
while((`date +%s`<nB));do sleep 1;done
但我想知道是否有一个命令可以做到这一点?如果sleep --usedatetimecheck 3s 3600
(可暂停睡眠是可选的,如 3 秒)存在那就太好了。
顺便说一句,我用来检测电脑何时从挂起状态唤醒的技巧是睡眠 3 秒,比较睡眠前的日期时间,如果超过 9 秒,则猜测它已唤醒(也可以检查高负载平均值并增加 9 秒测试)。
我用的是ubuntu。
Ps.:有人可能会说有几件事会立即发生。但这就是为什么它应该是可选的。我刚刚想到的另一件事是我们是否可以发送信号来更新所有睡眠命令,例如pkill -SIGUSR1 sleep
?
答案1
像这样的东西sleep --wake-me-from-suspend --realtime
实际上并不存在:
忽略挂起是最困难的部分,因为在挂起期间,你的CPU上不再运行任何软件,事实上,CPU没有运行,你需要依靠你的实时时钟设备来唤醒电脑。这将需要您的操作系统对其进行套利访问,因为,一个 RTC,许多用户和程序,您不能只授予一个对它的访问权限,并希望它不会破坏其他人所做的事情。
因此,您需要一些能够与您的操作系统(我猜是 Linux?)对话并安排 RTC 设置的东西。
systemd-timer
s是去这里的方法。
你需要两件事:
- 您需要将要执行的内容转换成 systemd 可以理解的格式。 A单元文件(具体来说是一项服务)。读
man systemd.service
! - 您需要安装一个能够将机器从挂起状态唤醒的 systemd 计时器。既然那是一个非常特权操作,您只能作为超级用户拥有的计时器来执行此操作。看看
man systemd.timer
,寻找WakeSystem=true
。
您编写服务文件来执行您想要执行的操作。这可能是您想要启动的进程(而且通常是这样),因此您编写了适当的服务文件Type=
(通常是 exec)。或者,您可能会执行一些操作,例如创建文件、向端口发送消息或执行其他操作,您自己的脚本会等待这些操作发生后再继续。
您编写计时器单元,以便它启动您的服务。你过去常常OnCalendar=
给自己一个艰难的、“挂钟和纸质日历”的起床时间。确保指定正确时区的时间!我通常建议您使用相当明确的日期时间格式2023-10-14 11:15:00 UTC
。
您将两个文件(例如veganeye.service
和veganeye.timer
)放入系统单元的目录中(通常是/etc/systemd/system/
),然后启动计时器单元(systemctl enable --now veganeye.timer
)。您可以在 shell 脚本中完成所有这些操作,编写两个文件并启用计时器。代码确实不多。