Установка параметров линии TTY терминала во время выполнения процесса

Когда мне нужно настроить параметры линии терминала, когда оболочка терминала доступна, я использую stty .

Когда я подключаю отладчик к процессу, выполняющему curses, текущие настройки tty мешают запуску отладчика (эхо выключено, новые строки не переводятся). Я хотел бы иметь возможность включить echo и onlcr , чтобы я мог правильно использовать отладчик ( pdb ).

Когда я приостанавливаю этот процесс ( Ctrl + z ), чтобы проверить настройки управления с помощью stty , эти настройки терминала не изменились. Я думаю, что проклятия могут сохранять / восстанавливать эти настройки по сигналам приостановки / возобновления.

Есть ли способ удаленно установить параметры терминала с активным процессом без приостановки работы родительской оболочки?

0
14.05.2017, 01:29
1 ответ

Стандартный вывод процесса — это файловый дескриптор, который доступен как путь где-то в системе UNIX. Нам нужно будет найти этот путь, чтобы установить его атрибуты tty. Поскольку это curses, этот файловый дескриптор будет указывать на терминальное устройство (pts/tty).

Первый шаг — найти pid запущенного процесса. Используя pidof, pgrep или ps aux:

ps aux | grep '<program arguments>'

Получив pid запущенного процесса, вы можете найти путь к подключенному терминальному устройству. к этому процессу, используя proc (если доступно) или lsof.


Получите путь tty/pts, используя lsof:

 device="$(lsof -X -p <pid> | grep -o '/dev/.*' | grep -v urandom | uniq)"

Это даст вам что-то вроде:

 device=/dev/pts/4

Здесь мы используем опцию -X для игнорирования TCP-соединений для остановки lsof от зависания и -p, чтобы сообщить lsof, что ему присвоен pid.


Если доступен /proc (linux), то вы можете найти символическую ссылку под его pid:

device=/proc/<pid>/fd/1

Теперь, когда мы знаем устройство вывода, мы можем установить его атрибуты tty:

stty onlcr echo icrnl icanon -F $device

stty по умолчанию устанавливает атрибуты tty стандартного ввода текущего терминала. Вы можете использовать -F, чтобы указать путь.

Теперь по какой-то причине мне пришлось установить эти атрибуты несколько раз, чтобы они закрепились:

while true; do stty onlcr echo icrnl icanon -F /proc/<pid>/fd/1; done

Примечание. После написания этого я понял, что ps может отображать прикрепленный TTY рядом с процессом: ps ao args,tty.

1
28.01.2020, 04:46

Теги

Похожие вопросы