我想在特定时间运行脚本。我发现 at 命令是解决方案,但我附加的 shell 脚本没有被执行。我使用了下面的多个命令但没有用。
echo "`./time.sh`" | at -t 07101805
echo `./time.sh` | at -t 07101805
at -t 07101738 <./time.sh
at -t 07101737 -f ./time.sh
我还atrun
使用以下命令启动了
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist
职位列表如下:
at -l
2020 年 7 月 10 日 31 日 星期五 18:15:00
随着时间的推移,它会从列表中消失,这也意味着 at 命令正在工作,但它不执行脚本。
shell脚本很简单,如下所示:
#!/bin/sh
echo "the time is `date`" >time.txt
echo "yes the at command worked">>time.txt
如果还有其他方法,请分享。谢谢
答案1
at需要两种时间:固定时间和直觉时间。
at -t 202111231735 是 2021 年 11 月 23 日 17:35
现在 + 3 天; 0700;下周二 1200 点,按照你的预期去做。
paul $ echo foo | at now + 3 days
warning: commands will be executed using /bin/sh
job 16 at Tue Jul 14 16:55:00 2020
paul $ date
Sat 11 Jul 16:56:02 BST 2020
paul $ echo foo | at 0700
warning: commands will be executed using /bin/sh
job 17 at Sun Jul 12 07:00:00 2020
paul $ echo foo | at 1200 next tuesday
warning: commands will be executed using /bin/sh
job 18 at Tue Jul 14 12:00:00 2020
paul $ atq
18 Tue Jul 14 12:00:00 2020 a paul
17 Sun Jul 12 07:00:00 2020 a paul
16 Tue Jul 14 16:55:00 2020 a paul
paul $
您的反引号命令是完全错误的:它们将立即执行您的脚本,并将其实际的标准输出填充到即将进行的作业中。当您在创建作业时重定向所有输出时,它设置的作业实际上是空的——没有标准输出可以放入其中。
将一堆命令读入 at 也是有缺陷的。它们将由 /bin/sh 运行,而不是由您可能拥有的任何 shebang 中的 shell 运行。如果您确实必须有几行命令,请使用 HereDoc 并非常小心在创建作业时或最终运行时是否会发生 shell 扩展。
只需将脚本的名称(和任何参数)回显到 at 中即可。然后,at 的 shell 将看到 shebang 并运行正确的 shell。此外,您对脚本所做的任何修复都将有效,因为 at 尚未读取实际脚本。您甚至不需要路径名,因为 at 会在执行脚本之前恢复您的 cwd 和环境。
日期的直观时间规范记录在(在我的 Mint 上)/usr/share/doc/at/timespec
。它采用 Bachus-Naur 语法的形式,所以不是很方便。使用at 07101805
解析为 undefined token concatenated_date
,这似乎假设MMDDCCYY
CC >= 1900,CC == 00 为当前世纪,{01..18} 中的 CC 相对于 1900。
查看您存储的作业,例如:
paul $ at -c 18
#!/bin/sh
# atrun uid=1000 gid=1000
# mail paul 0
umask 22
XDG_VTNR=8; export XDG_VTNR
... 50 lies of setup.
COLORTERM=mate-terminal; export COLORTERM
XAUTHORITY=/home/paul/.Xauthority; export XAUTHORITY
cd /home/paul || {
echo 'Execution directory inaccessible' >&2
exit 1
}
foo