我想通过 TOP 在我们的应用服务器上监控特定进程。目前,我在 BASH 中使用以下内容来监控我感兴趣的进程:
top -p $(pgrep PSAPPSRV | tr "\\n" "," | sed 's/,$//')
我原以为这是一个很好的解决方案,但我忽略了两个注意事项:
- 单个进程可以自行循环,创建新的 PID
- 当现有进程负载过大时,服务器可以生成新进程来应对负载。
这两种情况都意味着,如果我在运行上述命令时使用 PID 的“快照”,我就无法长时间监控进程。
这些进程以专用用户身份运行。但是,此用户运行与应用服务器相关的所有进程。而且,应用服务器实际上可能由 30 个进程组成,但我只对特定进程感兴趣。
是否可以将新的 PID 传递到已经运行的 TOP 输出中?
或者最好的策略是以一定的时间间隔重新调用 TOP,并传递当前时间的 PID?
答案1
top
确实不是为完成您想要做的事情而设计的(事实上,某些版本top
甚至不支持该-p
选项)。
对于您的情况,我能想到的最佳选择是包装top
一个脚本,使用-d
和-n
选项反复调用它,例如
#!/bin/sh
while [ true ]; do
clear
top -d1 -n15 -p $(pgrep PSAPPSRV | tr "\\n" "," | sed 's/,$//')
sleep 1
done
这将使top
显示一个包含最多 15 个进程的屏幕,休眠一秒钟,然后再次执行(直到使用CTRL+中止脚本C。
这会失去的top
高级功能(例如更改排序顺序的能力 - 因此如果它很重要请确保您指定它),但无需太多工作即可为您提供相同类型的显示。