バックアップファイルをLogrotateのように世代管理(Shell Script, PowerShell, Python)

公開 | 更新 

サーバ管理には付き物のバックアップとその世代管理。ルータやNASの設定バックアップファイルは小さいのでついつい生成し放題にしがちです。ログファイル管理のlogrotateのような直近n個を維持して古いのを削除するfilerotateを各環境別に組んでみます。

1. Shell Script

まずはLinux系のシェルスクリプトで考えてみます。バックアップストレージに使われるOSがLinux系であることがほとんどなので、これを作ってしまえば多くの用途を網羅することが出来ます。これがもし、n日より古いファイルは削除、という命題であれば、Linuxではとても簡単に実現出来ます。しかし、不定期にとったバックアップをいくつも保持している場合など、古いバックアップファイルを削除する目的であるストレージ容量の確保と言う観点からも、あまり相応しいとは思えません。引き続き検索を続けていると、とある記事にめぐり逢いました、Great Tnx!!

日本よりも海外で少ないながらも昔からニーズのあるバッチ処理なのかもしれません。早速これをたたき台として、自分仕様に組んでみます。前提条件は次のように。

  • cdで対象フォルダに直接移動しない(バッチ終了後に面倒)。
  • 対象フォルダにサブフォルダのある可能性を考慮し、ファイルのみを対象とする。
  • 失敗したバックアップファイルなど、ゼロバイトファイルは対象外。
  • パスやファイル名に空白が含まれる可能性が有る。

最後の前提条件、空白対策が面倒なところで、xargsで渡す前に対策したり、lsコマンドに用意されている「–quoting-style=shell-always」で常にシングルクォート囲みとしたり。ところがこのオプションが実はBSD系など一部では対応しておらず、結局、空白をsedでバックスラッシュ掛けるようにしています。先人さまに感謝。

動作確認は、以下のシステムで行いました。巷ではlsの結果をtailに渡してという処理が期待通りに行われない、というケースも一部あるとの記述を目にします。導入の際はこの辺りの挙動をまず単発で試してみるのが確実です。

  • Ubuntu 18.04LTS
  • OpenWRT 18.06
  • FreeNAS 11.3  (注意:BSD系のlsにつき、「–quoting-style」オプション無)
  • Synology DSM 6.2.3
  • D-Link DNS-323 Alt-F 0.1RC4.1 (注意:Busybox内のlsに「–quoting-style」オプション無)

と、自作スクリプトが出来上がった頃に、ファイル名のワイルドカード指定まで綺麗にオプション指定出来る素晴らしい製作物を見つけてしまいました。Great Works!

 

2. PowerShell

次にWindows系です。実は十年以上前にVB Scriptで自作したこのfilerotate.vbsを永らく愛用していました。

しかしながら今ではvbsが時代遅れで不安全という傾向にあるので、PowerShell版を組んでみることにしたのですが、こちらも、n日より古いファイルを削除するのは、という命題の方が多いのが実状です。そこでPowerShellプログラミング基礎をつまみ食いしながら、つぎはぎで組んでみました。さすがにシェルとは違ってオブジェクト的で、凝った作りにせずとも実現することが出来ました。

 

3. Python

Shell Script版がAlt-F内のBusyBoxが古くて一部不具合となることから、もしもの時のためにPython版を組んでみました。古いシステム向けの互換性を考え、ver.2.7系で動くことを前提とします。

globを使ったこのアプローチは、こちらの記事を参考にさせて頂きました、Great Tnx!!

リスト内包表記やlambdaは初めて使いますが、ほぼコピペです、理解して使えるようになるにはまだまだ。他にもpathlibを使った手法など、いくつか別の手段がありますが、中にはPython3系限定の物があるので、もしそうした手法を使う際には少し注意が必要でしょう。

尚、上述のShellScript版では空白避けの「–quoting-style」が使えなかったAlt-Fでも、Pythonパッケージを入れて問題無く動くことを確認しました(ver.2.7.2)。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA