我想找到所有与终端无关的进程 ID。
当我执行 ps aux | less
命令,我在 TTY 字段中看到很多带有 ?
字符的进程。
我想获取那些进程 ID。有没有办法用 pgrep
做到这一点?
我试着查看 here 上的文档, 但我不是很清楚。
最佳答案
使用查找
pgrep --inverse -t \
"$(find /dev/ -type c -regex '.*tty[0-9]+' -printf '%f ')"
find
命令是通过command substitution 调用的.由于命令替换包含在双引号中,因此输出将作为单个单词传递给 preg
。
选项:
-type c
只选择字符特殊文件(可以用stat -c '%F'/dev/tty*
检查);-regex '.*tty[0-9]+'
仅选择与正则表达式匹配的文件,即所有 (.*
) 后跟一个或多个(+
) 个数字 ([0-9]
);-printf '%f '
打印文件名后跟一个空格(find
默认打印尾随换行符)。由于-t
选项接受 TTY 名称列表(没有"/dev/"
前缀),用逗号或空格分隔,我们可以在后面加上空格或逗号文件名 (%f
)。
使用文件名扩展
cd /dev
ttys=( tty[0-9][0-9]?[0-9]? )
cd - >/dev/null
pgrep -a --inverse -t "${ttys[*]}"
tty[0-9][0-9]?[0-9]?
扩展为 tty
后跟一位、两位或三位数字 (?
使前面的模式可选)。
ttys=( words )
从 IFS
构建一个数组- 分隔词(IFS
也称为“输入字段分隔符”)。
"${ttys[*]}"
被扩展为一个单词,由用 IFS
中的第一个字符分隔的数组项组成(默认为空格)。
关于shell - pgrep 用于与 Ubuntu 中的终端无关的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41084600/