如何通过名称改变进程的优劣

如何通过名称改变进程的优劣

Java 进程正在毁掉我的电脑(Intel i3,8GB RAM)。它占用了整个 CPU,系统开始挂起。我试图更改nicenessJava 进程,但我必须一直控制它,而这并不总是可行的。所以一开始我试图构建一个命令来niceness按名称更改进程。最终得到了如下结果:

ps ax -o pid,comm | grep java | awk '{print $1}' | tr "\n" " " | renice -n 5 -p

但看起来它不起作用。我不知道下一步该怎么做。也许是 Bash 脚本?每次都运行一次cron或一次?或者有更好的方法吗?watchx

答案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$给变量$prenice -n 5 -p $p在每次迭代时运行,直到 的输出pgrep ^java$被消耗

答案2

尝试这个:

pgrep java | xargs -n 1 echo renice -n 5 -p

如果输出没问题,则删除echo

答案3

毕竟,这是内存问题。我没有为 Jetty 设置最大内存,因此它尝试分配所有内存的 1/4。此外,我在这里找到了此类问题的最终解决方案:

OOM 杀手不起作用?

答案4

我发现最简单的方法是使用以下pidof命令:

renice <new niceness> -p $(pidof <process name>)

发现自:http://www.commandlinefu.com/commands/view/4614/renice-by-name

对于您的情况,可能将该命令放入crontab -e(以 root 身份)中,并设置您想要的时间间隔(例如每 30 分钟)。似乎您应该找到新的占用大量资源的 java 进程的根本原因,并查看是否可以修复/防止这种情况。

相关内容