Bash:超时后或事件后杀死进程

时间:2015-06-19 09:12:43

标签: bash timeout

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

#!/bin/bash
timeout 3600 ./longrunningprocess

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

我需要什么?

我想并行启动其他脚本,定期检查我的longrunning进程是否应该停止。当这个bash脚本返回时,应该终止timeout命令。

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

有什么类似超时命令吗?没有时间跨度,但我可以启动一个脚本,这就像事件触发器一样?

E.g。

#!/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

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

2 个答案:

答案 0 :(得分:0)

在后台启动longrunning进程并记住pid。

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

答案 1 :(得分:0)

如果您解析 longrunningprocess 的输出以确定是否需要杀死该进程,那么您可以执行以下操作:

#!/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,因此可以将其杀死。