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

Ste*_*ett 103 command-line bash schedule

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

nohup bash -c "sleep 28800 ; ./mycommand.sh" &
Run Code Online (Sandbox Code Playgroud)

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

Mit*_*tch 136

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

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

sudo apt-get install at
Run Code Online (Sandbox Code Playgroud)

有关更多信息、选项、示例和其他信息,请参阅 中的联机帮助页man 1 at

相对时间规范的示例(注意+和持续时间之间的空格):

at now + 8 hours -f ~/myscript.sh
Run Code Online (Sandbox Code Playgroud)

您还可以使用方便的简写,如tomorrownoon,如

echo "tweet fore" | at teatime 
Run Code Online (Sandbox Code Playgroud)

注意:这将运行命令来管的左侧立即-和它的输出(被输送到at)将运行at在预定时间。因此,上述命令计划tweet fore在下午茶时间运行。

该示例还演示了如何将操作通过管道传输到at. at -c是检查计划操作的方式,您可以方便地列出它们的编号,例如:

at -c 3
Run Code Online (Sandbox Code Playgroud)

  • 此外,还有 `at 8:00` 表示在绝对时间运行命令,以及 `batch` 表示“当计算机看起来空闲时” (7认同)
  • 如果有人想知道,“下午茶时间”是下午 4 点。由于某些原因,它没有在 http://manpages.ubuntu.com/manpages/raring/man1/at.1posix.html 中提到,但它在 `man at` 和这里 http://manpages.ubuntu.com/manpages/稀有/en/man1/at.1.html。 (4认同)
  • 也许我们可以提到默认情况下没有安装“at”实用程序,如果其他人想要获得它,只需安装“at”包?编辑:无论如何,我只是编辑了答案(还修复了联机帮助页链接)。 (3认同)
  • 关于现在运行的整个管道,而不是以后的问题,`echo "/command/to/run" | 在下午茶时间`产生预期的结果 (3认同)

use*_*020 13

将基于 Gnome 的 GUI 用于cronat等:

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

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

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

sudo apt-get install gnome-schedule
Run Code Online (Sandbox Code Playgroud)

在一个终端。

使用gnome-schedule, 对于主目录中的脚本,将使用这种类型的窗口设置一个新的“at”命令:

在此处输入图片说明


Rad*_*anu 12

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

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

39 22 30 8 5  /path/to/mycommand.sh
Run Code Online (Sandbox Code Playgroud)

更多关于:

  • 好的,是的,我应该提到我了解 Cron 工作。这甚至更混乱,因为它会无限期地坐在 crontab 中,对吧? (4认同)
  • @RaduRădeanu:使用 cron,小心它可能会在几年后再次启动(当 8 月 30 日又发生在星期五时)...... (4认同)
  • 这是一个聪明的黑客。然而,'at' 是一个更好的方法。如果电脑在 14:39 关闭会发生什么? (2认同)
  • @SteveBennett 是的,你是对的。该命令将保留在您的 `crontab` 中,直到您将其删除。一年后,当你忘记是谁把它放在那里以及为什么放在那里时,你会挠头想知道如何处理命令。 (2认同)

wja*_*rea 9

检查date循环中的输出。这是一个快速和肮脏的方式做到这一点,就像如果你不能使用atcron或其他工具。

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

until [[ $(date +%H:%M) == 12:00 ]]; do
    sleep 30
done
./mycommand.sh
Run Code Online (Sandbox Code Playgroud)

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

until [[ $(date +%d_%H:%M) == "25_12:00" ]]; do 
    sleep 30
done
./mycommand.sh
Run Code Online (Sandbox Code Playgroud)

以前,这个答案推荐了正则表达式,它有一些陷阱,比如很多特殊字符。它还建议匹配整个日期字符串,这更容易出错,因为它依赖于语言环境。例如,我使用一些法语语言环境格式,因为我住在魁北克,所以如果我忘记了这一点并写until [[ $(date) == "25 12:00" ]],它永远不会匹配,因为法语排序是“日月年,时间”而不是英文“月日时间年” .

  • 对于给这个答案点赞的两个人,请使用 `at`、`cron` 或任何其他真正的调度程序应用程序。任务调度很难,而不是你应该重新发明的轮子。 (13认同)
  • 至少,它在忙于等待,这是一种浪费。更糟糕的是,它不能保证是正确的。完全有可能(如果不太可能)错过条件。基于正则表达式的调度程序也非常容易出错。它可能工作得*好*,但与`at`相比没有优势。 (11认同)
  • 使用 `at` 的另一个原因是它的工作将在重启后继续存在。 (8认同)