杀死所有挂起时间超过一分钟的 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
您可能希望避免从另一个用户终止进程并在 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]…
我使用 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
您可能希望避免从另一个用户终止进程并在 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]…