安排单个事件在未来某个时间发生的简单方法是什么?

安排单个事件在未来某个时间发生的简单方法是什么?

很多时候我希望我的计算机执行一项任务,但现在不是。例如,我可以让它在 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

如果您想要桌面通知而不是电子邮件,您可以轻松地通过管道发送$messagenotify-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

相关内容