0

我想在特定时间(使用 at 命令)运行 bash 3 分钟后,我想关闭机器

这是我的 bash 代码(send.sh):

$ x=10
echo The value of variable x = $x

这是我的at命令:

at 2:30 PM tomorrow

我应该写什么send.sh运行3分钟然后关闭机器

4

2 回答 2

1

timeout命令可能是您正在寻找的。它会在指定的时间后向运行命令
发送信号。TERM此外,您可以指定它将发送一个附加 KILL信号,以防命令不愿对TERM信号作出反应。
这是一个 sceleton 脚本,您可以根据自己的目的进行修改:

#!/bin/bash

{ sleep 180; echo shutdown; } &

timeout --verbose --kill-after 1 180 \
    bash -c "trap 'echo TERM received, exiting gracefully!; exit' SIGTERM; while true; do sleep 1; echo Sending stuff...; done"

我的 while 循环的全部目的是模拟可能持续超过 3 分钟的事情。我添加了一个信号陷阱,一旦TERM发送信号就会触发,以便让脚本有机会在时机成熟时优雅地退出。一旦您测试了脚本并且您对结果感到满意,请删除echo前面的。shutdown

这是正在运行的脚本:

~/$ ./send.sh 
Sending stuff...
Sending stuff...
  (truncated)
Sending stuff...
timeout: sending signal TERM to command ‘bash’
shutdown
Terminated
TERM received, exiting gracefully!
于 2020-08-15T09:32:41.420 回答
1

我不明白您为什么要在脚本中执行“等待”部分:您可以使用at(伪代码)简单地执行以下操作:

at 2:30 PM tomorrow, launch "send.sh"
at 2:33 PM tomorrow, shut down your machine

问题是,如果你把它放在“send.sh”的某个地方,可能会发生以下情况:

send.sh 内容:

<do something>
<wait for three minutes>
<shut down your machine>
  1. <do_something>可能需要一些时间,并且会在预期的三分钟后启动关闭。
  2. 可能会出错,导致您的<do_something>脚本中止并且您的机器根本不会关闭。

因此,我建议创建两个单独的at条目。

在 Socowi 发表评论后编辑:

显然,可以at在命令后添加 - 子句,如下所示:

echo shutdown | at now + 3 minutes

这可能是您正在寻找的解决方案。

于 2020-08-15T08:32:45.067 回答