有没有一种便携的方法可以做到这一点?
在 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
选项)。