質問: ### 前提・実現したいこと vmstatコマンドをバックグラウンド実行し 結果をファイルに出力 その際中に他の処理を行い メモリとかサーバーの動きを確認したいと思っています。 sshコマンドでインスタンスに入らずに 外からvmstatコマンドを実行し 結果をファイルに出力するところまでは上手く行ったのですが それをバックグラウンドで実行しようとすると上手く行きません。 ### 発生している問題・エラーメッセージ 今のところ特にエラーメッセージは確認できていません。 ファイルの出力はされますが、空ファイルのままです。 そのファイルをサクラエディタで開くと以下のようなダイアログが開かれます。 ``` 書き込み禁止モードでロックできませんでした ``` ### 該当のソースコード ``` #(1) 結果が標準出力されます、入力状態には返ってきません ssh -o 'StrictHostKeyChecking no' -i "${KEYPEAR}" ec2-user@$eip sudo vmstat -n 1 | gawk '{ print strftime("%Y/%m/%d %H:%M:%S"), $0 } { fflush() }' #(2) 結果が$LOGFILE_PATHに出力されます、入力状態には返ってきません ssh -o 'StrictHostKeyChecking no' -i "${KEYPEAR}" ec2-user@$eip sudo vmstat -n 1 | gawk '{ print strftime("%Y/%m/%d %H:%M:%S"), $0 } { fflush() }' > $LOGFILE_PATH # (3) 問題のコマンド $LOGFILE_PATHのファイルは作られます、しかし出力はされません、入力状態にはなります ssh -o 'StrictHostKeyChecking no' -i "${KEYPEAR}" ec2-user@$eip sudo vmstat -n 1 | gawk '{ print strftime("%Y/%m/%d %H:%M:%S"), $0 } { fflush() }' > $LOGFILE_PATH & ``` ### 試したこと lsコマンドの結果を出力などしてみましたが同じような結果となりました。 Dockerのコンテナに対しても同じようなことを試しており、 そちらでは上手く実行されました。 ``` docker exec $CONTAINER_NAME sudo vmstat -n 1 | gawk '{ print strftime("%Y/%m/%d %H:%M:%S"), $0 } { fflush() }' > $LOGFILE_PATH & ``` ### 補足情報(言語/FW/ツール等のバージョンなど) Windows7 DockerToolbox Quickstart Terminal から実行しています。 AWS EC2 AmazonLinux のインスタンスにアクセスしています。
回答: 問題点に対する直接の回答ではありませんが、 vmstat ではなく、 sysstat と sar コマンドを使うほうが良いと思います。 参考:CentOS 6 サーバーのリソース状態を sysstat で監視しよう vmstat と比べると、ネットワークの情報など、採れる情報が豊富です。sysstat では、バイナリ形式でログが保存されますので、CPUのログだけであれば消費するディスクが小さくて済んでいるはずなのですが、他の多数の情報を保存するので、結果的にディスクの消費量は大きいです。デフォルトでは1ヶ月で周期でファイルが上書きされますので、ローテートの心配はいりません。逆にそれ以上保存したい場合は工夫が必要です。 表示する時は sar コマンドを使います。デフォルトでは、 crond で1日1回テキスト形式のログが生成されます。サンプリング間隔が短いとテキスト形式のログは大きくなってしまうので、この生成を止めて、オンデマンドにテキスト化したほうが良いかもしれません。 また、ksar というツールを使うとグラフ化することができます。 参考:sarデータのグラフ化 -kSar 基本編- sysstat は通常は crond で動かしますが、docker のコンテナ内を取りたい場合は sa1 コマンドを docker exec でキックしても動くと思います。例えば、以下のコマンドを定期的に実行することで、/var/log/sa/sa*dd* にバイナリ形式で結果が保存されます(未検証です)。 ``` /usr/lib64/sa/sa1 1 1 ```