
~のため
$ any-process | receiver
receiver
転送プロセスのPIDを取得できますか?
答え1
間接的。はい、しかし、接続されたパイプを識別し、接続されたパイプの他のすべてのPIDを検索する必要があります。
PIDが1730であるとしますreceiver
。を見て/proc/self/fd/0
(より簡単には/proc/self/fd/0
)と表示されるシンボリックリンクを見ることができますpipe:[43270]
。/proc/1730/fdinfo/0
。次に/proc/1729/fd/1
Display as Symlinkを見つけてflagsで確認pipe:[43270]
します。だからパイプの反対側を制御するプロセスを見つけます。/proc/1729/fdinfo/1
01
注:
- これはLinuxに特化したアプローチで、移植性がなく非効率的です。
- 複数のプロセスがそのパイプに書き込むことができます(また、書き込みがfd 1にある必要はありません)。
- 競合状態が発生しやすい。
any-process
他のユーザーが所有している場合は、そのファイルreceiver
記述子を表示できません。
両方のプロセスが認証された方法で通信できるようにするには、Unixソケットを使用する必要があります。SO_PASSCRED
オプションを使用すると、SCM_CREDENTIALS
発信者の pid、uid、および gid タイプでセカンダリ メッセージを使用できます。送信者によって指定された資格情報はカーネルでチェックされ、うそではないことを確認します(適切な機能がない場合はルートプロセス/CAP_SYS_ADMIN会議自分とは異なるプロセスIDを指定する機能)
答え2
実行プロセスをファイル記述子3にリダイレクトすると、簡単な方法が得られます。以下の例は次のとおりです。眠るコマンドがパイプに渡されるメモ注文する:
( sleep 100 & echo $!>&3 ) 3>pid | ps -p "$(<pid)"
sleep コマンドプロセスを確認できます。
ps -p $(<pid)