インストールスクリプト(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出力をキャプチャしてログに記録する良い方法はありますか?
ありがとう。
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.
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
...これはおそらくあなたが望むものです。
インタラクティブスクリプトの出力をログファイルにリダイレクトしているときに、この問題に遭遇しました。終了コードはいつでも評価できるため、ログに結果がないことは問題ではありませんでした。しかし、私は本当にインタラクティブなユーザーにプログレスバーを見せたかったのです。この答えは両方の問題を解決します。
まだコメントできません:(だからここにアップデートを追加します...
@Martinは私にとって最善の解決策でしたが、scpコマンドがスクリプトの途中にある場合、その出力はmay実際に後で実行されたコマンドの後に表示されます。
スクリプトはサブシェルでコマンドを実行する必要があるためだと思いますが、まだテストしていません。
編集:それは確かにシェルを生成するので、(ビルドスクリプトのように)順次実行する必要がある(そして実際に失敗する)場合は、scriptコマンドの使用に関するロジックを追加する必要があります。
つまり.
スクリプト-q-c "あなたのコマンド" && sleep 1
または同様のもので、親シェルは子シェルが終了するのを待ってから次に進みます。
scp myfile [email protected]:. && echo success!
非常に便利ですが、メッセージをログファイルに書き込むために、次のように変更しました
scp myfile [email protected]:. && echo myfile successfully copied! >> logfile 2>&1
これにより、「myfileが正常にコピーされました!」と書き込まれます。ログファイルへのメッセージ。
たぶん、 ' script 'を使用してターミナルセッションをログに記録できます。
試してください:
scp server:/file /tmp/ > /dev/tty
ここでの答えはどれも私にはうまくいきませんでした。長い地理的距離にわたって多くのファイルを含む大きなディレクトリを再帰的にコピーする必要があったので、ログに記録したかったprogress(&& echo success!
ははるかに十分ではありませんでした)。
私が最終的に設計し、どういうわけか働いたのは:
scp -vrC root@Host:/path/to/directory . 2> copy.log &
-v
詳細なロギングのトリックを実行する(-C
圧縮を許可します。-r
再帰)。
ログファイルのgrep
grep file copy.log | wc -l
これまでにコピーされたファイルの数を確認できました。
はい、最近proc_open()からphpスクリプト内で出力を取得しようとしていましたが、出力を取得しようとして静かな時間を失いました:-)しかし、ここで少し遅れて、ここでこの投稿を読んだことで、本当に必要ないことに気づきました私のスクリプトへのこのジャンキーな出力
終了コードだけが仕事をします:-)
$ exit_code = proc_close($ process);
$ grep -r "Error" xyz.out > abc.txt
上記のコマンドでは、出力をファイルabc.txtに保存しています。
このgrep
コマンドは、ファイルxyz.out内のテキストcontaingErrorを検索し、出力をabc.txtコンソールに表示せずに。