Bash:超时后或事件后终止进程



>我有一个运行长时间运行进程的脚本。此过程当前在超时后停止。

#!/bin/bash
timeout 3600 ./longrunningprocess

我的问题是现在这个过程在达到超时之前没有返回,有时我需要更早地停止它。

我需要什么?

我想并行启动一些其他脚本,该脚本会定期检查我的长时间运行进程是否应该停止。当此 bash 脚本返回时,应终止超时命令。

知道我如何实现这一目标吗?

有没有类似超时命令的东西?不是时间跨度,而是我可以启动的脚本,哪个像事件触发器?

例如

#!/bin/bash
fancyCommandKillsSecondCommandIfFirstCommandReturns "./myPeriodicScript.sh" "timeout 3600 ./longrunningprocess"

谢谢!

编辑:像"并行启动 2 个进程并在一个返回时杀死两个进程"之类的东西也可以工作......

编辑2:答案给了我一些脚本的想法:

#!/bin/bash
FirstProcess="${1}"
SecondProcess="${2}"
exec $FirstProcess &
PID1=$!
exec $SecondProcess &
PID2=$!
function killall {
    if ps -p $PID1 > /dev/null
    then
        kill -9 $PID1
    fi
    if ps -p $PID2 > /dev/null
    then
        kill -9 $PID2
    fi
}
trap killall EXIT
while true; do
    if ! ps -p $PID1 > /dev/null
    then
       exit;
    fi
    if ! ps -p $PID2 > /dev/null
    then
       exit;
    fi
    sleep 5;
done

这种做我想做的事。是否有任何本机功能或更好的方法来执行此操作?

在后台启动长时间运行的进程并记住 pid。

#!/bin/bash
timeout 3600 ./longrunningprocess &
long_pid=$!
./myPeriodicScript.sh
kill -9 ${long_pid}

如果您解析长时间运行的进程的输出以确定是否需要终止该进程,那么您可以执行以下操作:

#!/bin/bash
FIFO="tmpfifo"
TIMEOUT=10
mkfifo $FIFO
timeout 100 ./longrun &> $FIFO &
PID=$!
while read line; do
    echo "Parsing $line see if $PID needs to be killed";
    if [ "$line" = "5" ]; then
        kill $PID
    fi 
done < $FIFO
exit

这会将所有输出通过管道传输到 FIFO 并开始从该 FIFO 读取。此外,它保留了timeout过程的PID,因此可以将其杀死。

相关内容

  • 没有找到相关文章

最新更新