命令:

命令:

如何运行一个命令来列出某个屏幕下运行的进程的所有 PID(假设正在运行多个 bash 进程,因为我打开了多个选项卡)?我找到了以下帖子:找出屏幕会话中正在运行的命令

当屏幕中只有一个进程运行时,该命令有效,但当我在屏幕会话中打开多个选项卡时,该命令会失败。我得到的错误如下:

命令:

ps u -p $(ps -el | grep $(ps -el | grep 28572 | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')

输出:

grep: 28573: 没有这样的文件或目录

更新:

以下命令序列会产生预期结果。

  1. 获取所有屏幕进程

    ps waux | grep -i screen | grep -v grep | awk '{print $2}' | paste -s -d,
    
  2. 获取屏幕会话下运行的所有进程

    pgrep -P $(ps waux | grep -i screen | grep -v grep | awk '{print $2}' | paste -s -d,) | paste -s -d,
    
  3. 获取屏幕会话下运行的进程下运行的所有java进程

    ps -w -p $(pgrep -P $(pgrep -P $(ps waux | grep -i screen | grep -v grep | awk '{print $2}' | paste -s -d,) | paste -s -d,) | paste -s -d,) | grep java
    

注意事项:

  1. 我只关心java屏幕会话中运行的进程。
  2. 我使用该命令获取以逗号分隔的进程标识符列表,然后将其用作命令选项paste的参数。-Ppgrep

更新2:

我找到了一种避免使用该paste命令的方法xargs

ps waux | grep -i screen | grep -v grep | awk '{print $2}' | xargs -I{} pgrep -P {} | xargs -I{} pgrep -P {} | xargs -I{} ps -w -p {} |  grep java

答案1

试试这个,不过,只有在打开一个屏幕会话的情况下它才有效。

ps waux | grep screen$ | awk '{print $2}' | xargs pstree

例如

jeff@linux:~$ ps waux | grep screen$ | awk '{print $2}' | xargs pstree
screen───screen─┬─bash───top
                ├─bash───watch
                └─bash───xargs───pstree

如果您有多个屏幕会话,您可以像这样迭代它们:

jeff@jlinux:~$ for pid in $(ps waux | grep screen$ | awk '{print $2}'); do pstree $pid; done
screen───screen───bash
screen───screen─┬─bash───top
                ├─bash───watch
                └─bash───pstree

相关内容