【问题标题】:how to execute bash for 3 minutes then shut down the machine [closed]如何执行 bash 3 分钟然后关闭机器 [关闭]
【发布时间】:2020-08-15 07:18:59
【问题描述】:

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

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

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

这是我的at 命令:

at 2:30 PM tomorrow

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

【问题讨论】:

标签: linux bash shell terminal at-job


【解决方案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. &lt;do_something&gt; 可能需要一些时间,并且会在预期的三分钟后启动关闭。
  2. &lt;do_something&gt; 可能出错,导致您的脚本中止并且您的计算机根本不会关闭。

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

在 Socowi 发表评论后编辑:

显然,可以在命令后添加at-clause,如下:

echo shutdown | at now + 3 minutes

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

【讨论】:

  • 第二个at 命令可以添加到脚本的顶部,以便在每次脚本运行时自动安排关机:echo shutdown | at now + 3 minutes
【解决方案2】:

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 信号就会触发它,以便让脚本有机会在时机成熟时优雅地退出。测试脚本并对结果感到满意后,删除 shutdown 前面的 echo

下面是正在运行的脚本:

~/$ ./send.sh 
Sending stuff...
Sending stuff...
  (truncated)
Sending stuff...
timeout: sending signal TERM to command ‘bash’
shutdown
Terminated
TERM received, exiting gracefully!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多