如何在Linux中延迟一分钟后启动一个shell脚本?

12
如何在一分钟后启动shell脚本?
假设有两个bash文件a.sh和b.sh
我想在a.sh执行后的一分钟(或几秒钟)执行b.sh
那么我应该在a.sh中编写什么代码?
7个回答

30

简单易懂。您需要使用“at”来安排任务,使用“date”来计算未来的时间。

示例:

echo b.sh | at now + 1 minute

或者:

echo b.sh | at -t `date -v+60S "+%Y%m%d%H%M%S"`

-v+60S 增加 60 秒到当前时间。您可以精确控制要添加多少秒。

但通常情况下,当人们希望一个程序在另一个程序之后一分钟启动时,并不能百分之百确定它不会花费更多或更少的时间。 b.sh 可能会在 a.sh 完成之前启动,或者 a.sh 可能比“计划”的时间提前了 30 秒,而 b.sh 可能已经更快地启动了。

我推荐使用不同的模型。其中 b.sh 首先启动。 a.sh 在启动时创建临时文件,在执行完其任务并在结束时删除其临时文件。 b.sh 监视该临时文件是否被创建,然后被删除。并开始执行其任务。


1
是的,谢谢!这正是我想要的。但是可能有一点错误吧?它说“日期无效选项--v”。 - Alex Chan
3
不同版本的“date”命令支持不同的选项。请尝试使用以下命令:echo b.sh | at now + 1 minute - Dennis Williamson
b.sh会在可视窗口中执行吗?如何执行? - Alex Chan
它无论如何都不执行b.sh,我不知道为什么。 - Alex Chan
@alexchan 在添加 at 任务后但在花费时间之前。尝试运行 atq,它应该显示您的任务。此外,您可以查看系统日志并找出命令何时运行。至于在窗口中打开命令,则是一个完全不同的问题。您的 at 命令需要运行您选择的终端。您需要找出如何将命令输入终端。您的 at ENV 还需要正确设置 DISPLAY 变量。 - Mathieu J.
在Ubuntu上我遇到了一个错误:date: invalid option -- 'v'。 - Svetoslav Marinov

4

让a.sh的最后一行为:

sleep 60 && b.sh

(如果b.sh不在PATH中的任何目录中,请将其设置为完整路径以便访问。)

3
你可以直接使用 sleep
a.sh
sleep 60
b.sh

对于更复杂的情况,您可以使用at命令:

echo b.sh | at now + 1 minute

请参阅at命令的手册以获取更多信息。


不,它没有按预期执行b.sh。顺便问一下,如何在10秒后执行它?我将分钟更改为秒,但它显示语法错误。 - Alex Chan
@alexchan:at 命令无法进行精确到一分钟以内的时间增量。 - Dennis Williamson
sleep 60 实际上会暂停登录过程60秒。 - thebunnyrules

1

使用at命令。

请参阅man at以了解如何使用它。


0
如果您想在第一个脚本启动后若干秒执行第二个脚本,可以在第一个脚本中添加以下代码:
b.sh &

这是第二个:

sleep 10
# more commands

你可以将秒数作为参数从第一个传递到第二个。

不幸的是,at 不支持精确到一分钟以内的时间增量。


0

在cron中安排两个脚本同时运行,并在b.sh中设置所需的延迟。


0
你可以使用命令让你的脚本休眠1分钟。
sleep 1m

然后当您想要调用第二个脚本时

bash a.sh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接