Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 将TOP命令的输出限制为特定的进程名称_Macos_Unix_Command Line_Top Command - Fatal编程技术网

Macos 将TOP命令的输出限制为特定的进程名称

Macos 将TOP命令的输出限制为特定的进程名称,macos,unix,command-line,top-command,Macos,Unix,Command Line,Top Command,如果调用top命令,则会得到所有正在运行的进程。但是,如何将输出限制为某个进程名,如“java” 我试过这个 top-l2 | grep java 但通过这种方式,您只会得到快照,而不会得到不断更新的列表。而且top-l0 | grep-java不是很清楚。如何top-b | grep-java使用监视命令 watch -d 'top -n1 | grep mysql' 找到要监视的进程的PID,然后使用-p选项,该选项允许您向top命令提供PID列表 例如: top -p 18884 -p

如果调用top命令,则会得到所有正在运行的进程。但是,如何将输出限制为某个进程名,如“java”

我试过这个 top-l2 | grep java
但通过这种方式,您只会得到快照,而不会得到不断更新的列表。而且top-l0 | grep-java不是很清楚。

如何top-b | grep-java使用监视命令

watch -d 'top -n1 | grep mysql'

找到要监视的进程的PID,然后使用
-p
选项,该选项允许您向
top
命令提供PID列表

例如:

top -p 18884 -p 18892 -p 18919

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
18884 user  25   0  672M  95M  9476 S     0.0  1.1   0:02   1 java
18892 user  25   0 2280M 123M 12252 S     0.0  1.5   0:05   1 java
18919 user  22   0 1492M 198M 28708 S     0.0  2.4   0:07   1 java

(我相信您也可以传入逗号分隔的列表。)

我更喜欢以下内容,这样我仍然可以交互使用top,而无需每次运行时都查找PID:

top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`
当然,如果进程发生更改,则必须重新运行该命令

说明:

  • pgrep process name
    返回由换行符分隔的进程ID列表
  • tr“\\n”“”
    将这些新行转换为逗号,因为top需要一个以逗号分隔的进程ID列表
  • sed
    是一个流编辑器,这里使用
    sed的/,$/”
    删除后面的逗号
展开,您可以使用
pgrep
获取命名流程的所有PID,以执行以下操作:

top -p "$(pgrep -d ',' java)"

我使用以下方法解决了我的问题:

top-n1-b | grep“进程名称”

在这种情况下: -n用于设置top将执行什么过程的次数
和-b用于显示所有PID

它可以防止以下错误:
顶部:超出pid限制(20)

假设。。如果服务器上有20多个进程以相同的名称运行。。。这不会有帮助

top-p
pgrep oracle | head-n 20 | tr“\\n”,“sed's/,$/”

它将尝试列出并提供20个进程的实时输出,在这些进程中,我们很有可能错过其他消耗更多资源的进程


我仍然在寻找更好的选择,这是一个更具体的案例,就像我实际上在寻找的:


对于Java进程,您也可以使用
jps-q
,其中jps是$Java_HOME/bin中的一个工具,因此应该位于您的$PATH中。

运行以下命令将在控制台中进行持续更新:

bcsmc2rtese001 [~]$ echo $SHELL  
/bin/bash  
bcsmc2rtese001 [~]$ top | grep efare  or watch -d 'top | grep efare' or top -p pid
27728 efare     15   0 75184 3180 1124 S  0.3  0.0 728:28.93 tclsh  
27728 efare     15   0 75184 3180 1124 S  0.7  0.0 728:28.95 tclsh

以下代码通过watch命令每5秒更新一次进程列表:


watch-n5-ttop-b-n1-p$(pgrep java | head-20 | tr“\\n”,“sed's/,$/)
我来这里是在OSX上寻找这个问题的答案。我最终通过bash和awk得到了我想要的:

topfiltered() {
  [[ -z "$1" ]] && return
  dump="/tmp/top_dump"
  rm -f "$dump"
  while :; do
    clear
    [[ -s "$dump" ]] && head -n $(( $LINES - 1 )) "$dump"
    top -l 1 -o cpu -ncols $(( $COLUMNS / 8 )) | awk -v p="$(pgrep -d ' ' $@)" '
        BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
        NR<=12 || ($1 in pids)
    ' >"$dump"
  done
}
topfiltered(){
[[-z“$1”]]和返回(&R)
dump=“/tmp/top\u dump”
rm-f“$dump”
当:;做
清楚的
[[-s“$dump”]&&head-n$($LINES-1))“$dump”
top-l1-ocpu-ncols$($COLUMNS/8))| awk-vp=“$(pgrep-d''$@)”
开始{split(p,arr);for(k in arr)pids[arr[k]]=1}

NR只需
top-bn 1 | grep java
就可以为您实现这一点

我运行它(例如:
top-b | egrep-w'java | mysqld'
使用来自的答案,我能够创建一个一行程序

top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')

这对我来说在MacOS 10.12(Sierra)

上有效,使用Rick Byers的回答中提到的方法:

top -p `pgrep java | paste -sd "," -`
但我有20多个进程在运行,所以下面的命令对于遇到类似情况的人可能会有所帮助

top -p `pgrep java | head -n 20 | paste -sd "," -`
pgrep
在本例中获取具有给定名称-java的进程列表。
head
用于获取前20个PID,因为top在使用-p参数时不能处理超过20个PID。最后,
paste
将PID列表与“,”合并

您可以在上面的命令中控制要查找的进程名称以及要查看的具有该名称的进程数。如果具有给定名称的进程数少于20个,则可以忽略
头-n 20
部分。

这是迄今为止MacOS的唯一解决方案:

top -pid `pgrep java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`
尽管这将不希望报告
无效选项或语法:-pid
如果没有
java
进程处于活动状态

解释

此处发布的其他解决方案使用的格式为
top-pid1、id2、id3
,但MacOS的
top
仅支持笨拙的格式
top-pid id1-pid id2-pid id3

因此,首先,我们得到进程名为“java”的进程ID列表:

我们将其传输到
awk
,它将结果与定界器
“-pid”

唉,这留下了一个尾随定界符!例如,到目前为止,我们可能已经获得了字符串
“123-pid 456-pid 789-pid”

然后,我们只需使用
sed
删除定界符的最后6个字符

| sed 's/.\{6\}$//'`
我们已准备好将结果传递给
top

top -pid `...`
获取进程的pid:

# pidof <process>
Top仅显示2个“konsole”流程。
这在繁忙的服务器上通过ssh非常有用,不必通过grep进行传输。

在Mac上不起作用,因为Mac使用BSD工具而不是GPL工具。并且有一些区别。我认为“-b”版本类似于“-l 0”,但也打印了表头?在Mac上,它应该是“top-pid ID”但是Java进程可能有几个不同的ID,因为可能有几个Java进程。应该是“watch--d”。但是执行此命令时,我没有得到任何输出。-1:
man watch
:“watch反复运行命令,显示其输出和错误”;它不显示当前正在运行的进程,如
top
does@AlexanderOrlov,这里没有什么特别的魔力,只需使用top-n1打印和退出,并使用watch持续监视即可。@sdau,您的评论与我的回答无关,请下次仔细回复。我想我们应该添加-b选项。
watch-d'top-b-n1 |GrepMySQL’
BestAnswer,改进了dogbane,因此您可以实际键入名称,而不是粘贴大量PID(
top -pid `...`
# pidof <process>
# top -p <pid1>,<pid2>, etc
landis@linux-e6510:~>pidof konsole
1841 1709
landis@linux-e6510:~>top -p 1841,1709