列出所有进程而不控制终端(仅)?

列出所有进程而不控制终端(仅)?

有没有一种便携的方法可以做到这一点?

在 Linux 上,我可以使用,ps a -N 但此选项在其他 (POSIX) 系统上不可用。

当然我可以使用grep '^?'with,-o tty,...但是有更可靠的东西吗?

答案1

标准ps允许您使用其选项获取有关所有进程的信息-A,并使用 获取特定字段-o,例如TTY字段。

问题在于 TTY 字段的字符串在系统之间的格式不同。在 Linux 上,不控制 TTY 的进程将其 TTY 报告为?,而 FreeBSD 使用-,macOS 和 OpenBSD 都使用??

如果您想使用系统ps来执行此任务,您可以首先确定要查找什么字符串来识别没有终端的进程。

您可以使用ps -p 1 -o tty=此方法,假设 PID 1 是一个没有控制终端的现有进程。这应该?在 Linux、??macOS 和 OpenBSD 以及-FreeBSD 上输出。然后,您可以使用该字符串来过滤 的输出ps -A -o tty,pid

在下面的命令中,我还删除了该ps命令输出中的所有空格:

ps -A -o tty,pid |
awk -v t="$(ps -p 1 -o tty= | tr -d '[:blank:]')" '$1 == t { print $2 }'

这应该适用于大多数地方,除了 PID 1 不存在且不适用于基于 Busybox 的系统(因为 Busybox 的实现ps没有-p选项)。

相关内容