我使用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进程。我怎么能这样做?
答案 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 signal
,killall
会发送您的流程可能忽略的SIGTERM
。您是否能够在命令行中使用此命令终止长时间运行的脚本?您可能需要SIGKILL
/ -9