我想找到与终端无关的过程的所有ID。
当我执行ps aux | less
命令时,我在TTY字段中看到了许多带有?
字符的过程。
我想获得这些过程ID。有没有办法使用pgrep
?
我尝试在这里查看文档,但对我来说并不清楚。
使用find
pgrep --inverse -t
"$(find /dev/ -type c -regex '.*tty[0-9]+' -printf '%f ')"
find
命令通过命令替换调用。由于命令替换为双引号,因此输出作为一个单词传递给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
分开的数组项组成(默认为Space)。
我想找到与终端无关的过程的所有ID。
有没有办法使用
pgrep
?
否,但是ps
及其选项有一种方法
-
a … this option causes ps to list all processes with a terminal …
-
-N Select all processes except those that fulfill the specified conditions (negates the selection). …
-
o format Specify user-defined format. …
so,仅获取这些流程ID ,没有标题线:
ps a -N opid=