これを行うポータブルな方法はありますか?
Linuxでは可能ですps a -N
が、他の(POSIX)システムではこのオプションは使用できません。
もちろんgrep '^?'
一緒に使えますが、-o tty,...
より安定したものはありますか?
答え1
Standardをps
使用すると、そのオプションを使用してすべてのプロセスに関する情報を取得し、フィールドなどの特定の-A
フィールドを取得できます。-o
TTY
問題は、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
)、ほとんどの場所で機能します。