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

Kill all R processes that hang for longer than a minute

我使用 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 进程。我该怎么做?

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


上次更新 user1747036 的 推荐 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 signal killall 发送您的进程可能会忽略的 SIGTERM。你能在命令行上用这个杀死一个很长的 运行ning 脚本吗?您可能需要 SIGKILL / -9

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

您可能希望避免从另一个用户终止进程并在 SIGTERM (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  "${pid}"
        fi
    done
}

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

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

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

timeout [option] duration command [arg]…