Спочатку я спробував простежити кілька xtermсекунд назад до xtermпід на основі інформації, яку я знайшов, /proc/locksале це було вільно. Я думаю, це спрацювало, я думаю, але це було в кращому випадку нескінченно - я не повністю розумію всю інформацію, яку надає файл, і лише відповідав тому, що, здавалося, відповідає його вмісту та відомим термінальним процесам.
Потім я спробував спостерігати lsof/straceза активним write/talkпроцесом між ptys. Я ніколи раніше не використовував жодної програми, але вони, схоже, покладаються на них utmp. Якщо мій цільовий pty utmpз будь-якої причини не мав запису, вони обоє відмовилися визнати, що він існує. Можливо, є шлях, але я був досить розгублений, щоб відмовитися від цього.
Я спробував щось udevadmвідкрити із 136 та 128 основними вузлами пристроїв, як рекламуються, ptsі ptmвідповідно /proc/tty/drivers, але мені також не вистачає будь-якого дуже корисного досвіду роботи з цим інструментом, і в черговий раз виявилося нічого істотного. Цікаво, що, проте, я помітив, що :minдіапазон для обох типів пристроїв був перерахований у приголомшливому стані 0-1048575.
Тільки після того, як я переглянув цей документ ядра , я почав думати про проблему з точки зору mounts. Я раніше це читав кілька разів, але коли тривалі дослідження в цьому рядку привели мене до цього патчету 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) як вихід.