リダイレクトせずに出力をキャプチャして端末に保存します。

リダイレクトせずに出力をキャプチャして端末に保存します。

オンデマンドモードも含めて、出力がttyに送信されるかどうかによって異なる動作をするデーモンの出力をキャプチャする必要があります。 stdoutをどこにでもリダイレクトすると、不快な形式でデータを書き込むロギングモードになり、ATMは他の操作を実行するために再構成/変更/著者に連絡するのに時間がかかりすぎます。

どういうわけか通常どおり(リダイレクトなしで)実行できますが、画面に書き込むすべてのコンテンツのコピーをファイルとして取得できますか?

ベストアンサー1

socatstdoutを擬似端末デバイスにし、mydaemonここに記録されているすべてのデータをパイプに送信できますsocat

ls -l /proc/self/fd代わりにここを使用してくださいmydaemon

$ socat  -u 'exec:"ls -l /proc/self/fd",pty,raw' - | tee file.out
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:32 0 -> /dev/pts/25
lrwx------ 1 stephane stephane 64 Aug 20 13:32 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:32 2 -> /dev/pts/25
lr-x------ 1 stephane stephane 64 Aug 20 13:32 3 -> /proc/30930/fd

lsstdoutが新しいptyデバイスになる方法を確認してください(/dev/pts/26

ない場合は、次のものを使用することもsocatできますscript

$ script -qc 'stty raw; ls -l /proc/self/fd' file.out < /dev/null
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:35 0 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:35 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:35 2 -> /dev/pts/26
lr-x------ 1 stephane stephane 64 Aug 20 13:35 3 -> /proc/31010/fd

(これ< /dev/nullを行うと、script端末はモードrawに設定されません)。

ただし、この場合、すべてのstdin、stdout、およびstderrがこのptyにリダイレクトされることに注意してください。この方法と同様に、stdinとstderrを変更したくない場合は、socat次のようにします。

$ script -qc 'stty raw; exec <&3 2>&4 3<&- 4>&-; ls -l /proc/self/fd' file.out 3<&0 4>&2 < /dev/null
total 0
lrwx------ 1 stephane stephane 64 Aug 20 13:37 0 -> /dev/pts/25
lrwx------ 1 stephane stephane 64 Aug 20 13:37 1 -> /dev/pts/26
lrwx------ 1 stephane stephane 64 Aug 20 13:37 2 -> /dev/pts/25
lr-x------ 1 stephane stephane 64 Aug 20 13:37 3 -> /proc/31065/fd

すべてのscript実装/バージョンがサポートされて-cいるか-qオプションになるわけではありません。

一部のシステムにはunbuffer expectスクリプトが付属していますが、いくつかのバグや制限があることに注意してください。

おすすめ記事