[Server] tarコマンドで「tar: Removing leading `/ from member names」エラーが出た時の話

2021年9月17日

テクノロジー

eyecatch 標準コマンドが大好物な、ユゲタです。 サーバーサイドでよく利用するコマンドの一つに、「アーカイブコマンド」があります。 tar , zip , rar ...などなど、圧縮形式には色々ありますが、PC系では、zipが主流ですが、 linuxサーバーは、デフォルトでは、zipコマンドはインストールされていません。 代わりに、tarコマンドが昔からデフォルトでインストールされていますが、 windowsやmacでは、逆にこちらの圧縮形式は皆無です。 アーカイブユーティリティ的なソフトを使えば、zipでも、tarでも、なんでも圧縮、解凍できてしまいますが、 こと、webサーバーで、圧縮処理をシステム的に行いたい場合は、tarコマンドが使いやすいでしょう。 これは、数多くサーバーを運用してきて、今現在も更に多くのサーバーを自己運用しているサーバーエンジニアとしての、 ユゲタの個人的意見でもあります。 ちなみに、linuxでは、「unar」という圧縮コマンドが、圧縮タイプの網羅性が優れているので、 煩雑な圧縮形式に対応する場合は、コチラをりようすると、いいでしょう。 圧縮ファイルの解凍に圧倒的に便利な「unar」コマンド

tarコマンドでエラーが出た

今回、汎用的なシステムを作っていて、 そこで利用できるログファイルをアーカイブする処理をする必要があったので、 手軽に使えるtarコマンドを使ってみたところ、 $ tar -zxvf /var/www/html/test.tgz /var/www/html/test.log
tar: Removing leading `/' from member names
こんなエラーがターミナルに表示されました。 このエラーの意味は、「/」はlinuxでは、「ルート」の意味を持ち、管理権限での実行が必至になるので、 今現在のアカウントでは、権限がないですよ。 というエラーメッセージです。 でも、実行結果は、正常に圧縮はできているので、要するに、警告的なエラーメッセージです。

エラーメッセージの対処方法

このエラーに対応するには、いくつかの方法がありますが、どれを選択するかは、お好み次第です。

-1. Cオプションを使う

この方法は、少しトリッキーですが、 圧縮元の階層にどうしても「/」を含めなければ行けない場合に、次のようにすると、エラーは出なくなります。 $ tar -zxvf /var/www/html/test.tgz -C / var/www/html/test.log 圧縮元の手前に「-C」オプションを付けて、少しわかりにくいですが、「/」と階層を半角スペースを空けます。 -Cオプションは、「cd」コマンドの役割で、コマンド実行内部での実行環境を指定している感じです。

2. cdコマンドを使う

単純ですが、階層を「/」ルートからのアクセスではなく、対象フォルダまで移動して、相対パスで指定する方法です。 $ cd /var/www/html $ tar -zxvf test.tgz test.log 同じ階層で処理するのであれば、この方法はシンプルに書けて悪くないですね。 ワンラインで書きたければ、cdコマンドの改行を「;(セミコロン)」にすることで、1行で記述できますよ。

3. 無視する

そもそも、エラーが出ようが出まいが、結果は正常に終了しているので、この警告レベルのエラーは無視してしまうという方法もあります。 でも、いちエンジニアとしては、アラートすら表示されるのが気持ち悪いので、今後OSのアップデートで、 警告レベルから、禁止レベルにならないとも限らないので、 できれば、こういうエラーは表示しないように対処することが、重要な気もしているので、この方法はあまりオススメできませんけどね。 まあ、1回コッキリでコマンドを実行するレベルであれば、いいのかもしれません。 その場合は、出来上がりのアーカイブファイルの中身をちゃんとデータ欠損がないか確認をすることを合わせてオススメしておきます。

一体、どんなシステムを作っているの?

今回、ユゲタが作っている汎用的なシステムというのは、今自社で開発している、SaaSソフトウェアで、複数のバランシング構成された、ユーザーアクセスサーバーに保持されたデータを ログデータの集計処理を行うサーバーに一括で移動させたいために、一旦アーカイブ化して、処理をするようにする時に利用していたんですね。 なので、対象のサーバー内部でターミナルコマンドを実際に打ち込んで実行するのではなく、 sshコマンドで、対象サーバーに鍵ログインして、アーカイブして、rsyncでアーカイブデータを取得する・・・ というような、極めてマニアックな処理を行っていたんですね。 その際にどうしてもサーバー毎に構成が違うので、ルート形式からの絶対パスで処理を行う必要があったので、今回の場合、2番めのcd方式で対応するようにしました。 このエラーを見るマニアックなエンジニアの人がいたら、盛り上がりそうなので、是非お話しましょう。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ