Java 进程正在毁掉我的电脑(Intel i3,8GB RAM)。它占用了整个 CPU,系统开始挂起。我试图更改niceness
Java 进程,但我必须一直控制它,而这并不总是可行的。所以一开始我试图构建一个命令来niceness
按名称更改进程。最终得到了如下结果:
ps ax -o pid,comm | grep java | awk '{print $1}' | tr "\n" " " | renice -n 5 -p
但看起来它不起作用。我不知道下一步该怎么做。也许是 Bash 脚本?每次都运行一次cron
或一次?或者有更好的方法吗?watch
x
答案1
如果只有一个java
实例正在运行,则只需:
renice -n 5 -p $(pgrep ^java$)
$(pgrep ^java$)
:命令替换;bash
用 的输出替换此命令pgrep ^java$
;pgrep ^java$
返回名称与正则表达式 匹配的进程的 PID 列表^java$
,该正则表达式与名称完全匹配的所有进程匹配java
如果有多个java
实例正在运行:
for p in $(pgrep ^java$); do renice -n 5 -p $p; done
for p in $(pgrep ^java$); do renice -n 5 -p $p; done
:与上面几乎相同;$(pgrep ^java$)
是命令替换;bash
用 的输出替换它pgrep ^java$
;pgrep ^java$
返回名称与正则表达式 匹配的进程的 PID 列表^java$
,该正则表达式与名称完全匹配的所有进程匹配java
;这扩展到for
循环中,循环将 的输出的新行分配pgrep ^java$
给变量$p
并renice -n 5 -p $p
在每次迭代时运行,直到 的输出pgrep ^java$
被消耗
答案2
尝试这个:
pgrep java | xargs -n 1 echo renice -n 5 -p
如果输出没问题,则删除echo
。
答案3
毕竟,这是内存问题。我没有为 Jetty 设置最大内存,因此它尝试分配所有内存的 1/4。此外,我在这里找到了此类问题的最终解决方案:
答案4
我发现最简单的方法是使用以下pidof
命令:
renice <new niceness> -p $(pidof <process name>)
发现自:http://www.commandlinefu.com/commands/view/4614/renice-by-name
对于您的情况,可能将该命令放入crontab -e
(以 root 身份)中,并设置您想要的时间间隔(例如每 30 分钟)。似乎您应该找到新的占用大量资源的 java 进程的根本原因,并查看是否可以修复/防止这种情况。