ターミナルシェルが利用可能なときにターミナルライン設定を構成する必要があるときstty
。
呪いを実行しているプロセスにデバッガを接続すると、現在のtty設定によってデバッガは実行されません(エコーがオフになり、改行文字は変換されません)。デバッガを適切に使用できるようにオン/オフできるようにecho
したい()。onlcr
pdb
制御設定を確認するためにプロセス(Ctrl
+)を一時停止しても、これらの端末設定は変更されません。 Cursが信号を一時停止/再開したときにこれらの設定を保存/復元できると思います。z
stty
親シェルを一時停止せずにアクティブプロセスを使用してリモートで端末設定を指定する方法はありますか?
答え1
プロセスのstdoutは、UNIXシステムのどこかでパスとして使用できるファイル記述子です。 tty プロパティを設定するには、このパスを探す必要があります。これは呪いなので、このファイル記述子はターミナルデバイス(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
ここでは、lsofが中断されるのを-X
防ぐためにTCP接続を無視し、lsofに 。-p
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
。