質問

(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 コンソールに表示せず。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top