![安排单个事件在未来某个时间发生的简单方法是什么?](https://linux22.com/image/22801/%E5%AE%89%E6%8E%92%E5%8D%95%E4%B8%AA%E4%BA%8B%E4%BB%B6%E5%9C%A8%E6%9C%AA%E6%9D%A5%E6%9F%90%E4%B8%AA%E6%97%B6%E9%97%B4%E5%8F%91%E7%94%9F%E7%9A%84%E7%AE%80%E5%8D%95%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
很多时候我希望我的计算机执行一项任务,但现在不是。例如,我可以让它在 30 分钟内通知我该下班了。或者也许我希望它在 2 小时后运行一个复杂的测试,当时我确信大多数其他人都会离开办公室。
我知道我可以创建一个 cron 作业在一天中的特定时间运行,但这似乎是一项大量工作,因为我想要的只是“在 10 分钟内运行此脚本”之类的简单内容,此外我还必须弄清楚从现在开始实际是 X 分钟/小时/天的时间,然后在完成后删除 cron 作业。
当然,我可以编写这个脚本并在后台运行它:
sleep X
do_task
但这看起来很笨重:我要么需要为每个任务一个新脚本,要么我需要编写和维护一个足够通用的脚本来完成我想要的事情,更不用说我必须计算出分钟中有多少秒,我想要的几个小时或几天。
难道这个问题没有一个既定的解决方案吗?
答案1
我使用一个简单的脚本at
:
#!/bin/bash
# email reminder notes using at(1)...
read -p "Time of message? [HH:MM] " time
read -p "Date of message? [dd.mm.yy] " date
read -p "Message body? " message
at "$time" "$date" <<EOF
echo "$message" | mailx -s "REMINDER" [email protected]
EOF
如果您想要桌面通知而不是电子邮件,您可以轻松地通过管道发送$message
到notify-send
或。dzen
答案2
通用的使用方法at
是
编写一个脚本来完成您想做的事情。使用所有外部命令的完整路径,将输出记录到正确的日志文件或通过邮件发送。
测试脚本。
激活它at -f YOURSCRIPT -t MMDDhhmm
答案3
到 2023 年,您可能希望使用systemd
而不是完成此操作,at
因为许多发行版现在atd
默认禁用。
您可以按如下方式使用 systemctl:
systemd-run --user --on-calendar=<iso time> <command> [arguments...]
例如
systemd-run --user --on-calendar="2023-11-03 07:00" /usr/bin/aplay /home/user/chime.wav
这将创建一个瞬态计时器,该计时器将在执行命令后被删除。如果 --on-calendar 的参数包含星号,例如 --on-calendar="--* 07:00”,该命令每天都会执行。
要获取所有已配置计时器的列表,请使用
systemctl --user list-timers