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

MLS*_*LSC 6 bash process kill signals

我有一个 bash 脚本做了很多事情,称为script.sh

#!/bin/bash
#It
#Is
#Doing
#Things
Run Code Online (Sandbox Code Playgroud)

有没有办法可以从自身内部获取此脚本的进程 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
Run Code Online (Sandbox Code Playgroud)

dev*_*ull 20

作为timeoutGNU coreutils 一部分的实用程序为您完成:

timeout 5m bash script.sh
Run Code Online (Sandbox Code Playgroud)

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

  • 对我来说很好用。我制作了一个主要由`while 组成的脚本:; 做回声你好;done` 然后运行`timeout 1s bash ./thatscript.sh`——它打印了很多次“hello”并在大约一秒钟后终止,正如预期的那样。 (2认同)

Hau*_*ing 14

你得到了 PID PID=$$

使用命令可能最容易实现您想要的timeout

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

(sleep $TIMEOUT && kill "$PID") &
Run Code Online (Sandbox Code Playgroud)


小智 11

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

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

while true
do
    date
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

  • ......好吧,为什么不呢? (2认同)

Sté*_*las 5

您可以将循环更改为:

#!/bin/bash -
SECONDS=0
while ((SECONDS < 5*60))
do
  echo "line printed"
done
Run Code Online (Sandbox Code Playgroud)

或者插入((SECONDS < 5*60)) || exit到你最深的循环中。

SECONDSin ksh, zshandbash是一个每秒递增的特殊变量。