scp出力を最適にキャプチャしてログに記録する方法は?
質問
(scpを使用する)インストールスクリプトから出力をキャプチャして、ログに記録しようとしています。ただし、scpが出力するすべて、つまり進行状況バーが表示されません。
画面出力:
コピー / user2 / cdb / builds / tmp / uat / myfiles / *に server / users / myfiles as cdb
cdb @ serverのパスワード: myfile 100%| ******************************** | 2503 00:00
ログ出力:
コピー / user2 / cdb / builds / tmp / uat / myfiles / *に server / users / myfiles as cdb
ファイルがそこに届いたことを本当に知りたいです。これは私が今役に立たないことを試みているものです:
myscript.sh 2>& 1 | tee mylogfile.log
scp出力をキャプチャしてログに記録する良い方法はありますか?
ありがとう。
解決
scpがログから成功したかどうかに関係なく、あなたはちょうど行方不明に見えます。
スクロールバーが標準出力に印刷されず、ncursesまたは他の種類のTUIを使用していると思いますか?
scpの戻り値を見て、成功したかどうかを確認できます。
scp myfile user@host.com:. && echo success!
man scp
のコメント
scp exits with 0 on success or >0 if an error occurred.
他のヒント
scpは、制御コードを使用して進行状況バーを端末に出力します。出力をリダイレクトするかどうかを検出し、進行状況バーを省略します。
「スクリプト」を使用してscpを端末で実行するようにthatすことで、それを回避できます。デフォルトでほとんどのディストリビューションにインストールされるコマンド:
script -q -c "scp server:/file /tmp/" > /tmp/test.txt
test.txtの内容は次のようになります。
file 0% 0 0.0KB/s --:-- ETA
file 18% 11MB 11.2MB/s 00:04 ETA
file 36% 22MB 11.2MB/s 00:03 ETA
file 54% 34MB 11.2MB/s 00:02 ETA
file 73% 45MB 11.2MB/s 00:01 ETA
file 91% 56MB 11.2MB/s 00:00 ETA
file 100% 61MB 10.2MB/s 00:06
...これはおそらくあなたが望むものです。
インタラクティブスクリプトの出力をログファイルにリダイレクトしているときに、この問題に遭遇しました。終了コードを常に評価できるため、ログに結果が表示されなくても問題ありませんでした。しかし、インタラクティブなユーザーにプログレスバーを表示してほしかったです。この答えは両方の問題を解決します。
「 script」を使用できます 'でターミナルセッションを記録します。
scp myfile user@host.com:. && echo success!
は非常に役立ちますが、ログファイルにメッセージを書き込むには、次のように変更しました
scp myfile user@host.com:. && echo myfile successfully copied! >> logfile 2>&1
これにより、「myfile正常にコピーされました!」ログファイルへのメッセージ。
試してください:
scp server:/file /tmp/ > /dev/tty
まだコメントできません:(だからここに更新を追加します...
@Martinが私にとって最良の解決策でしたが、scpコマンドがスクリプトの途中にある場合、出力は実際にその後実行されたコマンドの後に 表示される場合があります。
スクリプトはサブシェルでコマンドを実行する必要があるためだと思いますが、まだテストしていません。
EDIT:実際にシェルが生成されるため、(ビルドスクリプトのように)シーケンシャルな方法で実行する(実際に失敗する)必要がある場合は、スクリプトコマンドの使用に関するロジックを追加する必要があります。
i.e。
script -q -c"あなたのコマンド" &&スリープ1
または同様のもので、親シェルは次に進む前に子シェルの終了を待機します。
はい、最近proc_open()からphpスクリプト内で出力を取得しようとしていました 私は出力を取得しようとして静かに時間を失った:-) しかし、ここで少し遅れて、この投稿を読んで、スクリプトにこのジャンキーな出力が本当に必要ないことを実感しました
終了コードだけが仕事をします:-)
$ exit_code = proc_close($ process);
$ grep -r "Error" xyz.out > abc.txt
上記のコマンドでは、出力をファイルabc.txtに保存しています。
この grep
コマンドは、ファイル xyz.out の Error を含むテキストを検索し、出力を abc.txt コンソールに表示せず。