터미널을 제어하지 않고 모든 프로세스를 나열합니까(만)?

터미널을 제어하지 않고 모든 프로세스를 나열합니까(만)?

이를 수행하는 휴대용 방법이 있습니까?

Linux에서는 가능 ps a -N 하지만 다른 (POSIX) 시스템에서는 이 옵션을 사용할 수 없습니다.

물론 grep '^?'함께 사용할 수 있지만 -o tty,...더 안정적인 것이 있습니까?

답변1

Standard를 ps사용하면 해당 옵션을 사용하여 모든 프로세스에 대한 정보를 얻고 필드 와 같은 -A특정 필드를 얻을 수 있습니다 .-oTTY

문제는 TTY 필드의 문자열 형식이 시스템마다 다르다는 것입니다. Linux에서 TTY를 제어하지 않는 프로세스는 TTY를 ?FreeBSD에서 사용하고 -macOS와 OpenBSD에서 모두 사용하는 으로 보고합니다 ??.

시스템을 사용하여 ps이 작업을 수행하려면 먼저 터미널 없이 프로세스를 식별하기 위해 찾아야 할 문자열을 결정할 수 있습니다.

ps -p 1 -o tty=PID 1이 제어 터미널이 없는 기존 프로세스라고 가정하고 이 방법을 사용할 수 있습니다 . 이는 FreeBSD 뿐만 아니라 ?Linux, macOS, OpenBSD에서도 출력됩니다 . 그런 다음 해당 문자열을 사용하여 출력을 필터링할 수 있습니다 .??-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) 대부분의 장소에서 작동합니다.

관련 정보