プロセスの実行中にターミナルTTY回線設定を指定します。

プロセスの実行中にターミナルTTY回線設定を指定します。

ターミナルシェルが利用可能なときにターミナルライン設定を構成する必要があるときstty

呪いを実行しているプロセスにデバッガを接続すると、現在のtty設定によってデバッガは実行されません(エコーがオフになり、改行文字は変換されません)。デバッガを適切に使用できるようにオン/オフできるようにechoしたい()。onlcrpdb

制御設定を確認するためにプロセス(Ctrl+)を一時停止しても、これらの端末設定は変更されません。 Cursが信号を一時停止/再開したときにこれらの設定を保存/復元できると思います。zstty

親シェルを一時停止せずにアクティブプロセスを使用してリモートで端末設定を指定する方法はありますか?

答え1

プロセスのstdoutは、UNIXシステムのどこかでパスとして使用できるファイル記述子です。 tty プロパティを設定するには、このパスを探す必要があります。これは呪いなので、このファイル記述子はターミナルデバイス(pts / tty)を指します。

最初のステップは、実行中のプロセスのpidを見つけることです。pidofpgrepまたは使用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に 。-ppid


利用可能な場合/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

関連情報