方便地安排命令以便以后运行?


87

从现在开始8个小时运行命令的简单方法是什么?我可以这样想:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

有没有更“合适”的方式?


nohup+ 出问题了sleep吗?为什么它是“不合适的”?
cprn 2015年

Answers:


123

您可以使用该at命令。将at在稍后的时间执行命令。该at实用程序将读取从标准输入,并将它们一起组命令作为在作业,以在稍后的时间被执行。

通常,at默认情况下,它是在Ubuntu中默认安装的,但是如果您的发行版不包含它,请通过以下方式安装:

sudo apt-get install at

有关更多信息,选项,示例以及其他信息,请参见Ubuntu联机帮助存储库

例:

at now +8 hours -f ~/myscript.sh

您还可以使用便捷的速记方式,例如tomorrownoon,如

echo "tweet fore" | at teatime 

警告:这将立即在管道的左侧运行命令,但仅在稍后显示其输出。该示例还演示了如何将操作通过管道传递到atat -c是检查计划的操作的方法,可以方便地列出它们的编号,例如:

at -c 3

19
添加一个简单的用法示例来解决原始海报的问题可能会有所帮助,例如at now +8 hours -f ~/myscript.sh
steeldriver

6
此外,还可以at 8:00在绝对时间运行该命令,并且batch“当计算机看上去空闲时” 运行该命令
Simon Richter

4
如果有人想知道,请teatime在下午4点。由于某些原因,在manpages.ubuntu.com/manpages/raring/man1/at.1posix.html中未提及,但man atmanpages.ubuntu.com/manpages/raring/en/man1/at.1.html中
2013年

3
也许我们可以提到默认情况下未安装“ at”实用程序,如果有人想获得它,只需安装“ at”软件包?编辑:无论如何,我只是编辑了答案(还修复了手册页链接)。
Heartsmagic 2014年

4
请注意,管道进入at将立即运行命令,并且仅计划输出。我有4个小时的3D打印失败,因为我想安排时间,gpio write 8 1但立即执行。
Maciej Swic '17

8

是的,您可以设置Cron作业。

例如,如果现在时间是14:39:00,今天是8月30日星期五,则可以使用以下crontab -e命令在crontab文件中添加以下cron作业(将在8小时后执行):

39 22 30 8 5  /path/to/mycommand.sh

更多关于:


3
好的,是的,我应该提到我对Cron职位的了解。这甚至更麻烦,因为它会无限期地位于crontab中,对吧?
史蒂夫·贝内特

4
@RaduRădeanu:使用cron时,请小心,它可能会在几年后再次触发(星期五在8月30日另一天发生)……
Olivier Dulac

2
这是一个聪明的技巧。但是,“ at”是一种更好的方法。如果在14:39关闭计算机,将会发生什么?
2013年

1
错,这仍然不是我的意思。我的意思是,事件发生后,您输入的文本(我认为)实际上仍会位于crontab中,从而为您创建了另一个清理任务。
史蒂夫·贝内特

2
@SteveBennett是的,您是对的。该命令将保留在您的命令中,crontab直到您将其删除。一年后,当您忘记了放置它的人以及原因时,您将不知所措,想知道如何使用该命令。
Paddy Landau

8

将基于Gnome的GUI用于cronat等。

CronHowto的引入建议使用gnome-schedulegui,这比在终端中键入所有垃圾要好得多(特别是对于那些不是“超级” * nix / bsd用户的“普通” Ubuntu用户。)

通过使用Unity Dash(或其他应用程序菜单)运行以查找“ 计划任务”或正在运行gnome-schedule

在基于Gnome的Ubuntu系统上,“应用程序->系统工具”中的Gnome计划任务工具(来自gnome-schedule软件包)提供了图形界面,提示您使用Cron。该项目的网站位于http://gnome-schedule.sourceforge.net/ ; 该软件可以从软件中心安装或通过键入

sudo apt-get install gnome-schedule

在一个终端。

gnome-schedule对于您的主目录中的脚本,使用,将使用以下类型的窗口来设置新的“ at”命令:

在此处输入图片说明


5

在发现at事情之前,我想出了一种快速而肮脏的方法。

假设您希望脚本在中午运行:

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

假设您希望它明天明天中午运行(对我来说今天是11月24日):

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

更新:稍微好一点的方法:仅使用date +FORMAT以下方法测试您关心的数字:

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...

10
为了谁已经upvoted这个答案的两个人,请使用atcron或任何其他真实调度应用。任务调度很困难,而不是您应该重塑的方向。
dimo414 '17

1
@ dimo414我的方法有什么问题?
wjandrea

8
至少,它正在等待,这很浪费。更糟糕的是,不能保证它是正确的。很有可能(如果不太可能)错过该条件。将您的调度程序基于正则表达式也很容易出错。它可能工作得足够好,但没有优势at
dimo414 '17

(此外:我没有拒绝您的回答,我只是认为人们不应该使用它)
dimo414

4
使用的另一个原因at是因为其作业将在重新启动后仍然存在。
manatwork '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.