オンデマンドモードも含めて、出力がttyに送信されるかどうかによって異なる動作をするデーモンの出力をキャプチャする必要があります。 stdoutをどこにでもリダイレクトすると、不快な形式でデータを書き込むロギングモードになり、ATMは他の操作を実行するために再構成/変更/著者に連絡するのに時間がかかりすぎます。
どういうわけか通常どおり(リダイレクトなしで)実行できますが、画面に書き込むすべてのコンテンツのコピーをファイルとして取得できますか?
答え1
socat
stdoutを擬似端末デバイスにし、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
ls
stdoutが新しい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
スクリプトが付属していますが、いくつかのバグや制限があることに注意してください。