Спочатку я спробував простежити кілька xterm
секунд назад до xterm
під на основі інформації, яку я знайшов, /proc/locks
але це було вільно. Я думаю, це спрацювало, я думаю, але це було в кращому випадку нескінченно - я не повністю розумію всю інформацію, яку надає файл, і лише відповідав тому, що, здавалося, відповідає його вмісту та відомим термінальним процесам.
Потім я спробував спостерігати lsof/strace
за активним write/talk
процесом між ptys. Я ніколи раніше не використовував жодної програми, але вони, схоже, покладаються на них utmp
. Якщо мій цільовий pty utmp
з будь-якої причини не мав запису, вони обоє відмовилися визнати, що він існує. Можливо, є шлях, але я був досить розгублений, щоб відмовитися від цього.
Я спробував щось udevadm
відкрити із 136 та 128 основними вузлами пристроїв, як рекламуються, pts
і ptm
відповідно /proc/tty/drivers
, але мені також не вистачає будь-якого дуже корисного досвіду роботи з цим інструментом, і в черговий раз виявилося нічого істотного. Цікаво, що, проте, я помітив, що :min
діапазон для обох типів пристроїв був перерахований у приголомшливому стані 0-1048575
.
Тільки після того, як я переглянув цей документ ядра , я почав думати про проблему з точки зору mount
s. Я раніше це читав кілька разів, але коли тривалі дослідження в цьому рядку привели мене до цього патчету 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
Він друкує $$
кількість \0
нульових байтів до кожного pty та перевіряє io кожного основного процесу проти попередньої перевірки. Якщо різниця є, $$
то вона асоціює pid з pty. Це здебільшого працює. Я маю на увазі, для мене це повертається:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
Що правильно, але, вочевидь, це трохи расично. Я маю на увазі, якби хтось із тих, хто читав у той час купу даних, він, ймовірно, пропустив би. Я намагаюся розібратися, як змінити stty
режими на інший pty, щоб спочатку надіслати стоп-біт або щось подібне, щоб я міг це виправити.
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, надасть перелік PID (/proc/PID
) як вихід.