web-dev-qa-db-ja.com

scp出力を最適にキャプチャしてログに記録する方法は?

インストールスクリプト(scpを使用)からの出力をキャプチャしてログに記録しようとしています。しかし、scpが出力しているすべてのもの、つまりプログレスバーを取得していません。

画面出力:

/ user2/cdb/builds/tmp/uat/myfiles/*をcdbとしてサーバー/ users/myfilesにコピーします

cdb @ serverのパスワード:myfile 100%| ***************************** | 2503 00:00

ログ出力:

/ user2/cdb/builds/tmp/uat/myfiles/*をcdbとしてサーバー/ users/myfilesにコピーします

私のファイルがそこに到達したことを本当に知りたいです。これが私が今試みていることを無駄にしています:

myscript.sh 2>&1 |ティーmylogfile.log

Scp出力をキャプチャしてログに記録する良い方法はありますか?

ありがとう。

17
caseyboardman

Scpが成功したかどうかをログから見逃しているようです。

スクロールバーがstdoutに印刷されず、ncursesまたは他の種類のTUIを使用していると思いますか?

Scpの戻り値を見るだけで、成功したかどうかを確認できます。お気に入り

scp myfile [email protected]:. && echo success!

man scpは言う

scp exits with 0 on success or >0 if an error occurred.
8
Tarski

scpは、制御コードを使用してプログレスバーを端末に出力します。出力をリダイレクトして進行状況バーを省略したかどうかを検出します。

デフォルトでほとんどのディストリビューションにインストールされている「script」コマンドを使用して、scpをだましてターミナルで実行されていると思わせることで、これを回避できます。

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

...これはおそらくあなたが望むものです。

インタラクティブスクリプトの出力をログファイルにリダイレクトしているときに、この問題に遭遇しました。終了コードはいつでも評価できるため、ログに結果がないことは問題ではありませんでした。しかし、私は本当にインタラクティブなユーザーにプログレスバーを見せたかったのです。この答えは両方の問題を解決します。

26
Martin

まだコメントできません:(だからここにアップデートを追加します...

@Martinは私にとって最善の解決策でしたが、scpコマンドがスクリプトの途中にある場合、その出力はmay実際に後で実行されたコマンドの後に表示されます。

スクリプトはサブシェルでコマンドを実行する必要があるためだと思いますが、まだテストしていません。

編集:それは確かにシェルを生成するので、(ビルドスクリプトのように)順次実行する必要がある(そして実際に失敗する)場合は、scriptコマンドの使用に関するロジックを追加する必要があります。

つまり.

スクリプト-q-c "あなたのコマンド" && sleep 1

または同様のもので、親シェルは子シェルが終了するのを待ってから次に進みます。

1
sysadmiral
scp myfile [email protected]:. && echo success! 

非常に便利ですが、メッセージをログファイルに書き込むために、次のように変更しました

scp myfile [email protected]:. && echo myfile successfully copied! >> logfile 2>&1

これにより、「myfileが正常にコピーされました!」と書き込まれます。ログファイルへのメッセージ。

1
Fekensa D.

たぶん、 ' script 'を使用してターミナルセッションをログに記録できます。

1
ayaz

試してください:

scp server:/file /tmp/ > /dev/tty
0

ここでの答えはどれも私にはうまくいきませんでした。長い地理的距離にわたって多くのファイルを含む大きなディレクトリを再帰的にコピーする必要があったので、ログに記録したかったprogress&& echo success!ははるかに十分ではありませんでした)。

私が最終的に設計し、どういうわけか働いたのは:

scp -vrC root@Host:/path/to/directory . 2> copy.log &

-v詳細なロギングのトリックを実行する(-C圧縮を許可します。-r再帰)。

ログファイルのgrep

grep file copy.log | wc -l

これまでにコピーされたファイルの数を確認できました。

0
Tregoreg

はい、最近proc_open()からphpスクリプト内で出力を取得しようとしていましたが、出力を取得しようとして静かな時間を失いました:-)しかし、ここで少し遅れて、ここでこの投稿を読んだことで、本当に必要ないことに気づきました私のスクリプトへのこのジャンキーな出力

終了コードだけが仕事をします:-)

$ exit_code = proc_close($ process);

0
paranic
$ grep -r "Error" xyz.out > abc.txt

上記のコマンドでは、出力をファイルabc.txtに保存しています。

このgrepコマンドは、ファイルxyz.out内のテキストcontaingErrorを検索し、出力をabc.txtコンソールに表示せずに。

0
ravi teja Kadem