コマンドラインプログラムからのすべての出力をファイルにリダイレクトしようとしています。 Bashを使用しています。出力の一部はファイルに送信されますが、一部はまだ端末に表示され、ファイルに保存されません。
同様の症状は次のとおりです。
しかし、私は提案された解決策(キャプチャstderr)を試みましたが成功しませんでした:
<cmd> <args> > stdout.txt 2> stderr.txt
ファイルstderr.txtは作成されますが、空です。
考えられる手がかりは、コマンドラインプログラムが同じマシン上のサーバーと通信するクライアントであるということです。出力の一部がserverからのものである可能性があります。
発信元に関係なく、端末からのすべての出力をキャプチャする方法はありますか?
編集:
不足している出力がサーバーによって生成されることを確認しました。コマンドを別のターミナルで実行すると、両方のターミナルで出力が発生します。コマンドターミナルからのすべての出力をファイルにパイプできます。これにより、サーバー出力をキャプチャする方法に関する問題が発生しますが、それは別の質問です。
サーバーが同じ端末で起動されている場合、おそらく端末に書き込まれているのはサーバーのstderrであり、キャプチャしていないものです。
すべてをキャプチャする最良の方法は、実行することです。
script output.txt
サーバーまたはクライアントを起動する前に。これにより、すべてのターミナル出力がoutput.txtとターミナルにリダイレクトされた新しいシェルが起動します。次に、その新しいシェル内からサーバーを起動してから、クライアントを起動します。画面に表示されるすべてのもの(そのシェル内から端末に書き込むすべての入力と出力の両方)がファイルに書き込まれます。
完了したら、「exit」と入力して、script
コマンドによって実行されたシェルを終了します。
この構文を使用して、すべての出力stderrおよびstdoutをstdout.txtにリダイレクトできます。
<cmd> <args> > allout.txt 2>&1
POSIXではありませんが、bash 4には&>
演算子があります。
command &> alloutput.txt
サブシェルを実行して、プロセスをバックグラウンドで実行しながらすべての出力をリダイレクトできます。
( ./script.sh blah > ~/log/blah.log 2>&1 ) &
echo $! > ~/pids/blah.pid
クラッシュするプログラムで問題が発生しました* coughPHPcough *実行されたシェルがクラッシュすると、クラッシュの理由、Segmentation fault (core dumped)
を報告します
この出力がログに記録されないようにするには、これらの種類の出力をキャプチャして送信するサブシェルでコマンドを実行できます。
sh -c 'your_command' > your_stdout.log 2> your_stderr.err
# or
sh -c 'your_command' > your_stdout.log 2>&1
適切な答えはこちらです: http://scratching.psybermonkey.net/2011/02/ssh-how-to-pipe-output-from-local-to.html
your_command | ssh username@server "cat > filename.txt"