cyl*_*ude 14 bash ubuntu r kill
我使用crontask定期运行Rscript.不幸的是,我需要在一个小的aws实例上执行此操作,并且该过程可能会挂起,在彼此之上构建越来越多的进程,直到整个系统滞后.
我想写一个crontask来杀死持续时间超过一分钟的所有R进程. 我在Stack Overflow上找到了另一个答案,我已经调整过,我认为可以解决这个问题.我想出来了;
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1m "/usr/lib/R/bin/exec/R --slave --no-restore --file=/home/ubuntu/script.R";fi
Run Code Online (Sandbox Code Playgroud)
我直接从htop复制了任务,但它没有按照我的预期工作.我收到No such file or directory错误,但我已经检查了几次.
我需要杀死持续时间超过一分钟的所有R进程.我怎样才能做到这一点?
你可能希望避免来自其他用户杀死进程,并尝试SIGKILL(kill -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 ${1} "${pid}"
fi
done
}
# Leave a chance to kill processes properly (SIGTERM)
killpids "-15"
sleep 5
# Now kill remaining processes (SIGKILL)
killpids "-9"
Run Code Online (Sandbox Code Playgroud)
小智 8
为什么每分钟都会用cron暗示一个额外的进程?使用coreutils的超时启动R会不会更容易,然后在您选择的时间后自动终止进程.
timeout [option] duration command [arg]…
Run Code Online (Sandbox Code Playgroud)
我认为最好的选择是自己做这件事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
Run Code Online (Sandbox Code Playgroud)
该name参数是图像或路径给它的任何名称.您也包含了参数
如果-s signal未指定,则killall发送SIGTERM您的进程可能忽略的内容.您是否能够在命令行中使用此命令终止长时间运行的脚本?你可能需要SIGKILL/-9
更多信息,请访问http://linux.die.net/man/1/killall
| 归档时间: |
|
| 查看次数: |
1811 次 |
| 最近记录: |