🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

4097閲覧

Linuxバックアップ取得スクリプトについて

kinoko1374

総合スコア5

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2019/10/29 01:46

編集2019/10/29 06:23

前提・実現したいこと

RedHat7.4でサーバ監視のためのサーバを構築し、内部DBを外部サーバにバックアップするため
シェルスクリプトで処理を行っております。
流れとしては外部サーバの共有フォルダをマウントし、内部DBのdumpファイルをコピーする処理をしています。
しかしながら、コピー処理が失敗しているため、解消方法や切り分け方法を模索しております。

発生している問題・エラーメッセージ

cp: failed to close `/backup/mnt/xxxxxx.tar.gz': 入力/出力エラーです

該当のソースコード

cp /backup/xxxxxx.tar.gz /backup/mnt ここより前の処理でフォルダのマウントやdumpの作成・圧縮を行っています。

試したこと

スクリプトの内、コピーコマンド(上記部分)だけを切り出し実施
→エラーは出ずコピー成功(失敗時と同じdumpファイルをコピーしています
バックアップ先をWindows系OSに変更し、同様のスクリプトを実施
→エラーは出ずコピー成功

補足情報(FW/ツールのバージョンなど)

サーバ:CentOS Linux release 7.4.1708 (Core)
対向(バックアップ先):FUJITSU Storage ETERNUS NR1000Fというシリーズ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2019/10/29 01:48

質問は何でしょうか?
S_kawa

2019/10/29 06:11

エラー有無は10回ずつくらい検証された結果でしょうか。 単純に考えればdiskエラー、つまりHDDの故障の予兆である可能性があります。 もしその可能性はないと確信がある(fsck等実施済み)なら大きなファイルのネットワーク越しのコピーにcpを使うべきではないので、rsyncやscp、sftpで試してみてください。
kinoko1374

2019/10/29 06:18

>Y.H.さん 申し訳ないです。大事な質問事項が抜けていました。。。 DBのバックアップを別サーバへ吐き出したいと考えていますが、 コピー処理の段階でエラーが出ているので、考えられる問題点や切り分け方法をお伺いしたかったです。
kinoko1374

2019/10/29 06:21

>S_kawaさん エラー有無はそれぞれ10回ほど試しています。 HDD故障予兆も疑ってみましたが、その線も発見できずでした。 やはりNW越しの場合はscpなどの方がよさそうですね。
otn

2019/10/29 10:08

マウントは具体的にどうやっていますか?
kinoko1374

2019/10/30 01:02

>otnさん 具体的なコマンドとしては下記で行っています mount -t cifs -o user=****,password=****,vers=2.0 //a/b~~ //x/y~~
guest

回答2

0

自己解決

<自己解決>

cp: failed to close `/backup/mnt/xxxxxx.tar.gz': 入力/出力エラーです
のエラーをいくつか確認していると、HDDの故障(予兆)やファイルの破損などが候補として挙げられることから、
cpよりもその前段階での処理であるtarコマンドでのファイル圧縮で、正常に終了できてない可能性を疑いました。

そのため、tarコマンドの後、「wait $!」を入れ、完全にプロセス終了を待ってからcp処理を行うようにしましたが、
やはりcpエラーが頻出してしまいました。
次に「wait $!」の後、試しに「sleep 5m」で時間をおいてからcpするようにしたところ、
10回連続で成功しました。(dumpファイルのハッシュ値も一致)


(抜粋)
tar -czvf /backup/xxxxxx.tar.gz /backup/mnt
wait $!

sleep 5m

cp /backup/xxxxxx.tar.gz /backup/mnt


tar圧縮の後プロセスとしては終了しているはずですが、何かしらの後処理が走っているかもしれないといった状況です。

根本的な原因究明に至ることは現状できていませんが、ひとまずエラー回避という側面では
上記の運用でクローズにしたいと思います。

ご協力いただいた方々、ありがとうございます。

投稿2019/10/30 01:30

kinoko1374

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/10/30 05:53

$! は、最後にバックグラウンド実行したプロセスの番号なので、 wait $! は、今回無関係でエラーになっているはずです。(それ以前にコマンド末に&をつけて、バックグラウンド実行している物はないですよね?) sleep 5m だけが効いていると思われます。
kinoko1374

2019/10/30 05:59

>otnさん $!はバックグラウンド実行したプロセス番号を引っ張るものだったんですね。。。 勉強になりました。 sleep 5mだけでリトライしてみたところ、正常に終了したので、 おっしゃる通り、sleepだけが効いていたみたいです。 ありがとうございます。
otn

2019/10/30 06:40

> は、今回無関係でエラーになっているはずです。 間違い訂正。エラーじゃないです。 以前にバックグラウンド実行をしていなければ $! は空で、waitはすぐに終了。
guest

0

こんにちは。

エラーになっているcpコマンドは、cronかなにかでしょうか。
手動では大丈夫ということで、
エラーとエラーではないのとで、権限等で、違いは無いでしょうか。

例えば、手動で成功しているのは、書き込み先に権限があって、
失敗をしているのは、書き込み先に、権限のないプロセスで書き込みを試みているとか・・・

投稿2019/10/29 14:16

OneOneAdmin

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kinoko1374

2019/10/30 01:05

cpコマンドについてはcronで実施していました。 cronの実行ユーザについても、手動時と差分はありませんでした。 書き込み先については、マウント時に権限指定を行い、マウント先のファイル操作ができることも確認済です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問