杀死挂起超过一分钟的所有R进程

时间:2016-01-19 22:42:32

标签: r bash ubuntu kill

我使用crontask定期运行Rscript。不幸的是,我需要在一个小的aws实例上执行此操作,并且该过程可能会挂起,在彼此之上构建越来越多的进程,直到整个系统滞后。

我想写一个crontask来杀死持续时间超过一分钟的所有R进程。 I found another answer on Stack Overflow that I've adapted that I think would solve the problem。我想出来了;

if [[ "$(uname)" = "Linux" ]];then killall --older-than 1m "/usr/lib/R/bin/exec/R --slave --no-restore --file=/home/ubuntu/script.R";fi

我直接从htop复制了任务,但它没有按照我的预期工作。我收到No such file or directory错误,但我已经检查了几次。

我需要杀死持续时间超过一分钟的所有R进程。我怎么能这样做?

3 个答案:

答案 0 :(得分:8)

您可能希望避免从其他用户中删除进程,并在 SIGTERM kill -9)之后尝试 SIGKILL kill -15)。这是一个可以使用 CRON作业每分钟执行的脚本:

#!/bin/bash

PROCESS="R"
MAXTIME=`date -d '00:01:00' +'%s'`

function killpids()
{
    PIDS=`pgrep -u "${USER}" -x "${PROCESS}"`

    # Loop over all matching PIDs
    for pid in ${PIDS}; do
        # Retrieve duration of the process
        TIME=`ps -o time:1= -p "${pid}" |
              egrep -o "[0-9]{0,2}:?[0-9]{0,2}:[0-9]{2}$"`

        # Convert TIME to timestamp
        TTIME=`date -d "${TIME}" +'%s'`

        # Check if the process should be killed
        if [ "${TTIME}" -gt "${MAXTIME}" ]; then
            kill ${1} "${pid}"
        fi
    done
}

# Leave a chance to kill processes properly (SIGTERM)
killpids "-15"
sleep 5

# Now kill remaining processes (SIGKILL)
killpids "-9"

答案 1 :(得分:7)

为什么用cron每分钟都会有一个额外的进程? 使用timeout from coreutils启动R会不会更容易,然后在您选择的时间后会自动终止进程。

timeout [option] duration command [arg]…

答案 2 :(得分:5)

我认为最佳选择是使用R本身执行此操作。我不是专家,但似乎future包允许在单独的thread中执行一个函数。您可以在单独的线程中运行实际任务,并在主线程中休眠60秒,然后stop()

上一次更新 user1747036' answer建议使用timeout是更好的选择。

我的原始答案

这个问题更适合超级用户,但

有些问题
if [[ "$(uname)" = "Linux" ]];then 
  killall --older-than 1m \
    "/usr/lib/R/bin/exec/R --slave --no-restore --file=/home/ubuntu/script.R";
fi
  • name参数是图像的名称或其路径。您还包含了参数

  • 如果未指定-s signalkillall会发送您的流程可能忽略的SIGTERM。您是否能够在命令行中使用此命令终止长时间运行的脚本?您可能需要SIGKILL / -9

更多http://linux.die.net/man/1/killall