
pg_dumpを2つのpsqlファイルとログファイルにプッシュしようとしていますが、端末にノイズを追加したくありません。
このツールに関する多数の投稿を作成した後、tee
このコマンドに達しました。うまくいきますが、コンソールがまだフラッディングされているだけです。
pg_dump -a -t table-country -p 5432 -U usr db-maint2 2>&1 | tee >(psql -p 5432 -U postgres db-project) >(psql -p 5432 -U postgres db-gp-projet) >"initDB_$(date +%Y%m%d_%H%M).log"
読みましたが、より良い解決策が見つかりませんでした。
また、私のコマンドの後、pg_dumpの標準出力はコンソールに表示されますが、両方のpsqlのログはログファイルではなく端末にのみ送信されます。
編集:良いです。 psqlをログファイルに出力する方法を見つけました。
pg_dump -a -t table-country -p 5432 -U usr db-maint2 2>&1 | tee >(psql -p 5432 -U postgres db-project >"initDB_$(date +%Y%m%d_%H%M).log") >(psql -p 5432 -U postgres db-gp-projet >"initDB_$(date +%Y%m%d_%H%M).log") >"initDB_$(date +%Y%m%d_%H%M).log"
実際、これはpsqlコマンドの1つだけを記録し、-a
teeを使用してハンドルを追加しても、file.logにはpsql出力のみが生成されます。
N番目の編集:もうアイデアはありません。
n^+1 編集: もちろん、私の脳はついに目覚めました。
答え1
pg_dump -a -t table-country -p 5432 -U usr db-maint2 2>&1 | tee -a >"${LOGFILE}" >(psql -p 5432 -U postgres db-project >>"${LOGFILE}") >(psql -p 5432 -U postgres db-gp-projet >>"${LOGFILE}")
なぜ?
左から右へ:
pg_dump
標準出力に移動2>&1
エラーストリームを標準出力にダンプする|
パイプ標準出力とエラー- to
tee -a
、パイプの内容を保存し、複数のコマンドに渡します(最小の追加オプションを使用して最初に渡すとき)。 >"${LOGFILE}"
まず、pg_dump stdoutまたはerroutを記録したいと思います。次の構文に注意してください。()
ファイル名の周りには何もありません。私のスクリプトで変数を使用しています。>(psql -p 5432 -U postgres db-project >>"${LOGFILE}")
次に、psqlコマンドで最初のCOPY(角括弧で囲まれたコマンド)>>"${LOGFILE}"
前の行では、psqlの標準出力を私のファイルに追加(二重)するために使用しました>
。ここではエラーは発生しません。可能です。>(psql -p 5432 -U postgres db-gp-projet >>"${LOGFILE}")
次に、2番目のpsqlコマンドが提供され、stdoutがログファイルに2番目に追加されます。- コンソールへの出力はなく、すべてがteeによって保存されているようです(正直なところ、なぜそうなのかわかりません)。
一部の人々がティーとパイプのユースケースを理解するのに役立つことを願っています。
編集:私の最後のコマンドは
pg_dump -a -t table-country -p 5432 -U usr db-maint2 2>&1 | tee -a > /dev/null >(psql -p 5432 -U postgres db-project >>"${LOGFILE}") >(psql -p 5432 -U postgres db-gp-projet >>"${LOGFILE}")
ログファイルを汚染するのではなく、標準出力を削除します。エラーストリームをログファイルに保存することをお勧めします
pg_dump -a -t table-country -p 5432 -U usr db-maint2 2>"${LOGFILE}" | tee -a > /dev/null >(psql -p 5432 -U postgres db-project >>"${LOGFILE}") >(psql -p 5432 -U postgres db-gp-projet >>"${LOGFILE}")
しかし、まだテストしていません。
答え2
2 つの方法でリダイレクトを変更すると、この問題は解決されます。 1) 各コマンドの出力とエラーストリームをリダイレクトします。 2)ログファイルを上書きするのではなく、リダイレクト演算子をさらに変更します。
最終コマンドは次のようになります。
pg_dump -a -t table-country -p 5432 -U usr db-maint2 2>&1 | tee >(psql -p 5432 -U postgres db-project &>> "initDB_$(date +%Y%m%d_%H%M).log") >(psql -p 5432 -U postgres db-gp-projet &>> "initDB_$(date +%Y%m%d_%H%M).log") &>> "initDB_$(date +%Y%m%d_%H%M).log"
コマンドの出力は、次の形式で指定されたコマンドpg_dump
に渡されます。tee
tee file1 file2 &>> logfile
この場合、file1およびfile2パラメーターはプロセスです。tee
前のコマンドの出力はfile1、file2に書き込まれ、標準出力に書き込まれます。標準出力がキャプチャされ、ログファイルにリダイレクトされます(追加モードで)。
file1に書き込まれた出力は、psql
標準出力とエラーの独自のリダイレクトを設定するコマンドに渡されます。 2番目のコマンドでも同じことが起こりますpsql
。
ログファイルの名前はこのdate
コマンドを使用して派生し、分単位でのみ正しいため、ログファイルが潜在的に上書きされるのを防ぐために追加が必要です。あるいは、出力を別のログファイルに渡すこともできます。