端末を制御せずにすべてのプロセスを一覧表示しますか?

端末を制御せずにすべてのプロセスを一覧表示しますか?

これを行うポータブルな方法はありますか?

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)、ほとんどの場所で機能します。

関連情報