Когда мне нужно настроить параметры линии терминала, когда оболочка терминала доступна, я использую stty
.
Когда я подключаю отладчик к процессу, выполняющему curses, текущие настройки tty мешают запуску отладчика (эхо выключено, новые строки не переводятся). Я хотел бы иметь возможность включить echo
и onlcr
, чтобы я мог правильно использовать отладчик ( pdb
).
Когда я приостанавливаю этот процесс ( Ctrl
+ z
), чтобы проверить настройки управления с помощью stty
, эти настройки терминала не изменились. Я думаю, что проклятия могут сохранять / восстанавливать эти настройки по сигналам приостановки / возобновления.
Есть ли способ удаленно установить параметры терминала с активным процессом без приостановки работы родительской оболочки?
Стандартный вывод процесса — это файловый дескриптор, который доступен как путь где-то в системе 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
.