【问题标题】:Bash: Kill Process after timeout or after an eventBash:超时或事件后终止进程
【发布时间】:2015-09-05 05:01:17
【问题描述】:

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

#!/bin/bash
timeout 3600 ./longrunningprocess

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

我需要什么?

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

知道如何实现吗?

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

例如

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

谢谢!

编辑:类似“并行启动 2 个进程并在一个返回时终止两个进程”之类的东西也可以工作......

Edit2:答案给了我一些关于脚本的想法:

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

这种做我想要的。是否有任何本机功能或更好的方法来做到这一点?

【问题讨论】:

  • 您可以使用crontab 启动定期脚本检查并终止您的工作。至于杀戮本身,我不知道。
  • 我必须添加一些信息:运行启动 longrunningprocess 的脚本的脚本使用不同的参数多次运行。因此,全局 crontab 可能不是解决方案,因为它取决于当前上下文。在 C# 中,我可能会使用 CancellationTokens...

标签: bash timeout


【解决方案1】:

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

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

【讨论】:

  • 但是,如果我的 longrunningprocess 在超时之前返回怎么办?
  • 该 pid 不会在几个小时内被重用,因此您可以在 pid 消失时忽略(或使用2>/dev/null)错误消息。当您不确定这是否有效时,您可以使用一些ps 获取有关 long_pid 的更多信息,然后再将其杀死(检查脚本名称、开始时间、..),或者您可以设置进程组 ID脚本到 long_pid (如果存在进程组 ID 等于该进程 ID 的进程组,则该进程 ID 不应被系统重用,直到进程组生命周期结束)。
【解决方案2】:

如果您解析 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,所以可以被杀死。

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多