Если я сделаю:
echo foo > /dev/pts/12
Какой-то процесс прочитает это foo\n
из своего файлового дескриптора в сторону мастера.
Есть ли способ узнать, что это (эти) процесс (ы) является (есть)?
Или, другими словами, как я могу узнать, какой xterm / sshd / script / screen / tmux / receive / 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
для создания этого отображения, но есть ли более прямой, надежный и менее навязчивый способ получения этой информации?
terminal-emulator
open-files
pty
Стефан Шазелас
источник
источник
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, предоставил бы список PID (/proc/PID
) в качестве вывода./dev/pts/4
. Обычно это будет общим предком тех процессов, которые/dev/pts/4
открыты, но не обязательно.screen
, онаscreen
выделяет и активно управляет pty-slave в течение всего срока службы устройства, но, как я думаю, оболочка становится лидером процесса для этого tty и так, как ваш выход показывает, вы получаетеbash
или что-то изps
нетscreen
. Я проследил несколькоxterms
назад кxterm
pid на основе,/proc/locks
но это было свободно.Ответы:
Сначала я попытался проследить несколько
xterm
секунд назад доxterm
pid, основываясь на информации, которую я нашел,/proc/locks
но это было свободно. Я имею в виду, что это работало, я думаю, но в лучшем случае это было финансово - я не до конца понимаю всю информацию, которую предоставляет файл, и соответствовал только тому, что, казалось, соответствовало его содержанию и известным терминальным процессам.Затем я попытался посмотреть
lsof/strace
на активныйwrite/talk
процесс между ptys. Я никогда раньше не использовал ни одну из этих программ, но, похоже, они полагаютсяutmp
. Если у моего целевого ptyutmp
по какой-либо причине не было записи, они оба отказывались признать, что она существует. Может быть, есть способ обойти это, но я был достаточно смущен, чтобы отказаться от него.Я попробовал некоторые
udevadm
открытия с 136 и 128 старшими узлами устройств, как рекламировалосьpts
иptm
соответственно в нем/proc/tty/drivers
, но у меня также не было очень полезного опыта работы с этим инструментом, и я снова не нашел ничего существенного. Интересно, что я заметил, что:min
диапазон для обоих типов устройств был ошеломляющим0-1048575
.До тех пор, пока я не вернулся к этому документу по ядру , я начал думать о проблеме с точки зрения
mount
s. Я прочитал , что несколько раз до этого, но когда продолжение исследований в этой линии привело меня к этому это 2012/dev/pts
набор патчей у меня была идея:Я думал, что я обычно использую, чтобы связать процессы с
mount
? И конечно же:Так что с этой информацией я могу сделать, например, из
terminology
:Как вы можете видеть, при небольшом явном тестировании такой процесс может быть выполнен для довольно надежного вывода основного процесса произвольного pty. Что касается сокетов, я вполне уверен, что к этому можно подходить и в этом направлении,
socat
в отличие от отладчика, но мне еще предстоит выяснить, как это сделать. Тем не менее, я подозреваю, чтоss
может помочь, если вы более знакомы с этим, чем я:Итак, я настроил это на более подробное тестирование:
Он печатает
$$
num\0
null-байтов для каждого pty и проверяет io каждого главного процесса на соответствие предыдущей проверке. Если разница,$$
то он связывает pid с pty. Это в основном работает. Я имею в виду, для меня это возвращает:Что правильно, но, очевидно, это немного круто. Я имею в виду, если бы один из тех других читал в кучу данных в то время, он, вероятно, пропустил бы. Я пытаюсь выяснить, как изменить
stty
режимы на другом pty, чтобы сначала отправить стоп-бит или что-то в этом роде, чтобы я мог это исправить.источник
Если вы просто ищете, кому принадлежит соединение и откуда оно подключено, команда who будет работать хорошо.
Если вы также хотите узнать, что прослушивает это соединение, w покажет это в конце.
И чтобы получить pids, ограничьте ps сеансом tty, на который вы смотрите. Полностью ненавязчивый для загрузки.
Обратите внимание, что это может привести к красной сельди, в зависимости от времени. Но это хорошее место для начала.
источник
/dev/pts/4
, где вы выполняли этуw
команду.У меня была та же проблема с qemu, и я, наконец, нашел очень плохое решение (но все же решение): анализ памяти процесса.
Это работает здесь, потому что я знаю, что qemu хранит удаленные точки в строке с определенным форматом и размещается в куче. Может быть, он может работать и в других ситуациях с некоторыми изменениями и повторным использованием pid с выхода фьюзера (см. Другой ответ).
Код адаптирован отсюда .
источник