私が次のことをしたら:
echo foo > /dev/pts/12
一部のプロセスはfoo\n
ファイル記述子からマスターにそれを読み込みます。
そのプロセスが何であるかを理解する方法はありますか?
言い換えれば、どのxterm/sshd/script/screen/tmux/expect/socat...が反対側にあるのか、どうすればわかりますか/dev/pts/12
?
lsof /dev/ptmx
ptyのマスター側にファイル記述子があるプロセスを知らせます。プロセス自体はptsname()
(TIOCGPTN
ioctl)を使用して独自のfdに基づいてマスターデバイスを見つけることができるので、次のことができます。
gdb --batch --pid "$the_pid" -ex "print ptsname($the_fd)"
このマップは返された各pid / fdに対して作成されていますが、lsof
この情報を取得するより直接的で信頼性が高く、侵害の少ない方法はありますか?
ベストアンサー1
最初は見つけた情報に基づいてpidを追跡してみましたが、緩んでxterm
いました。私の言葉は、うまくいくと思いますが、せいぜい状況に応じたものです。そのファイルが提供するすべての情報を完全に理解しておらず、その内容と既知の端末プロセスの間で一致しているように見えるものだけが一致します。xterm
/proc/locks
それから、pty間のアクティブlsof/strace
プロセスを観察しようとしています。write/talk
私は以前に2つのプログラムを実際に使用したことがありませんが、それに依存しているようです。何らかの理由でutmp
私のターゲットptyにエントリがない場合、どちらもその存在を認めません。utmp
たぶんこの問題を解決する方法があるかもしれませんが、混乱して諦めました。
私はudevadm
それぞれと広告された136と128のマスターデバイスノードを使用していくつかの発見を試みpts
ましptm
たが、/proc/tty/drivers
そのツールの非常に有用な経験が不足しており、もう一度実用的なコンテンツを見つけることができませんでした。しかし、興味深いことに、両方:min
のデバイスタイプが驚くべき価格でリストされていることがわかりました0-1048575
。
これをもう一度見るまでこのカーネル文書しかし、私はこの問題をsの観点から考え始めましたmount
。私は以前この内容を何度も読んでいましたが、その分野の継続的な研究を通してこれを発見しました。この2012/dev/pts
パッチセット私は考えがあります:
sudo fuser -v /dev/ptmx
私の考えではプロセスをにリンクするには通常何を使用しますかmount
?本当に:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
したがって、この情報を使用して次の操作を実行できますterminology
。
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
ご覧のとおり、いくつかの明示的なテストでこれらのプロセスを作成して、任意のptyの基本プロセスを非常に安定して出力できます。ソケットに関しては、デバッガを使用するよりもその方向からアクセスすることが可能だと確信していますsocat
が、まだ方法を見つけることができませんでした。しかし、ss
あなたが私よりもよく知っていれば役に立つと思います。
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
だから実際に設定のためにもう少し明示的なテストをしました。
sudo sh <<\CMD
chkio() {
read io io <$1
dd bs=1 count=$$ </dev/zero >$2 2>/dev/null
return $((($(read io io <$1; echo $io)-io)!=$$))
}
for pts in /dev/pts/[0-9]* ; do
for ptm in $(fuser /dev/ptmx 2>/dev/null)
do chkio /proc/$ptm/io $pts && break
done && set -- "$@" "$ptm owns $pts"
done
printf %s\\n "$@"
CMD
各ptyに$$
num nullバイトを印刷し\0
、前の確認と比較して各基本プロセスのioを確認します。それ以外の場合は、$$
pidをptyに関連付けます。これ最大働く私の言葉は、私には次のように返されます。
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
正しい言葉ですが、明らかに少し不自然です。私の言うことは、それらの1つがその時点で大量のデータを読んでいる場合、それを見逃す可能性があるということです。stty
問題を解決するために、ストップビットが最初に送信されるように他のptyでモードを変更する方法を見つけようとしています。