如何运行一个命令来列出某个屏幕下运行的进程的所有 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: 没有这样的文件或目录
更新:
以下命令序列会产生预期结果。
获取所有屏幕进程
ps waux | grep -i screen | grep -v grep | awk '{print $2}' | paste -s -d,
获取屏幕会话下运行的所有进程
pgrep -P $(ps waux | grep -i screen | grep -v grep | awk '{print $2}' | paste -s -d,) | paste -s -d,
获取屏幕会话下运行的进程下运行的所有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
注意事项:
- 我只关心
java
屏幕会话中运行的进程。 - 我使用该命令获取以逗号分隔的进程标识符列表,然后将其用作命令选项
paste
的参数。-P
pgrep
更新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