如何在超时后自行终止 bash 脚本?

如何在超时后自行终止 bash 脚本?

我有一个 bash 脚本可以做很多事情,叫做script.sh

#!/bin/bash
#It
#Is
#Doing
#Things

有没有办法可以从脚本内部获取该脚本的进程 ID,然后在 5 分钟后将其杀死?

喜欢:

#!/bin/bash
#Get pid of script.sh here, start a 5 minute timer and kill the script after time runs out
#It
#Is
#Doing
#Things

答案1

timeoutGNU coreutils 中的实用程序会为您完成此操作:

timeout 5m bash script.sh

将在执行 5 分钟后终止脚本。

答案2

您可以通过 获得 PID PID=$$

您想要的可能可以通过命令最轻松地实现timeout

但您也可以运行后台进程:

(sleep $TIMEOUT && kill "$PID") &

答案3

如果您总是希望脚本在 5 分钟后超时,您可以简单地在后台进程中使用一个块,如下所示。如果您Ctrl+C在运行时使用,后台进程也会终止:

#!/bin/bash
{
    sleep 5m
    kill $$
} &

while true
do
    date
    sleep 1
done

答案4

您可以使用检查条件:

#!/bin/bash

START=$(date +%s)

while [[ $(($(date +%s) - $START)) -lt 300 ]]
do
    #do something here
done

echo QUIT

解释

  • date +%s获取自纪元以来的秒数,我们将其保存到START变量中,标记脚本的开始时间。
  • [[ $(($(date +%s) - $START)) -lt 300 ]]:我们(再次)得到当前时间date +%s减去开始时间(保存在START变量中)。
  • 如果结果小于300(5分钟),脚本继续运行,
  • 如果结果等于或大于300,意味着脚本自开始时间以来一直在运行5 minutes,我们退出while循环,脚本结束。

相关内容