• ベストアンサー

tarコマンドのリターン値

RedHatlinux AS3.0でperl内部でsystemコールでtarコマンドを 発行していますが $result = system "tar czvf・・・ 1> /dev/null 2> /dev/null" の結果として$resultの値に512という値が入ることがあります。 実際、tarファイルの作成には成功しているので0が返ってきて それ以外をエラーとして判定するように期待していたのですが 上記の通りの値になってtar成功に関わらずエラーと判断して しまいます。 この512というリターン値は何なのでしょうか? なお、単純にsystemで簡単なtarをすると0で普通に返ってきたりします。またtar元はディレクトリ配下の複数のファイルを*で圧縮しようとしています。

質問者が選んだベストアンサー

  • ベストアンサー
  • qaaq
  • ベストアンサー率36% (146/404)
回答No.3

FreeBSDですが、 % perldoc -f system すると、system関数のマニュアルが見られます。(Linuxにもあるんじゃないかな) そのサンプルスクリプトでは、 printf "child exited with value %d\n", $? >> 8; なんてしているので、exitステータスは、8bit shiftする(256で割る) 必要があるんですね。 # 検索すると同様の説明が他数あると思います。 >実際、tarファイルの作成には成功している 対象ファイルが全て入っていますか? 全ての対象ファイルが含まれていないtarファイルになっているんじゃないでしょうか。 ファイルリストを作ってtar の"-T"オプションで読み込むか、ディレクトリ名だけを指定するのが無難じゃないですかね? >-T, --files-from F > 抽出又は作成するファイルの名前をファイルFから読み込む

kuma200x
質問者

お礼

ありがとうございます。 tatsu99さんのアドバイスにもありましたが ビットシフトしていたりしているのですね。 またishi7474さんの所でもファイルリストの 制限などの話も伺いまして、tarの指定の仕方などに 検討の余地がありそうです。

その他の回答 (2)

  • ishi7474
  • ベストアンサー率32% (71/216)
回答No.2

とりあえず、標準出力と標準エラー出力を/dev/nullに捨てずに、 何かのファイルに書いて原因をつきとめる必要があると思います。 よくあるケースとして、"tar czvf /dir1/*"等とした場合、/dir1 以下に存在するファイル数が多過ぎて、ファイルリストがシェル のコマンドライン長の制限を越えることがあります(ワイルドカード はtarコマンドに渡される前に、bash等のシェルがファイル名の リストに展開します)。 そういう時は"tar czvf /dir1/"等と、ワイルドカードを使わない 指定を考えます。

kuma200x
質問者

お礼

ありがとうございます。 ファイルリストのコマンドライン長の制限はまったく 気がつきませんでした。 確かに数のあるディレクトリもあるので怪しそうです。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

perlの場合、tarの戻り値を知るためには、systemのreturn値を256で悪必要があります。従って512÷256=2ですので、tarの終了ステータスは2と言うことになります。 tarの終了ステータスは、参考URLを参照下さい。 (但しHP-UX11.0ですので、linuxと同じかどうかの保証は私は出来ませんので、ご了承下さい)

参考URL:
http://h50221.www5.hp.com/cgi/service/knavi/production/doc_disp.cgi?category=43&doc=jnav000219
kuma200x
質問者

お礼

ありがとうございます。 参考にさせていただいて linuxでのステータスについて探してみます。

関連するQ&A

  • UNIXのtarコマンドについて

    tarコマンドで以下の様に指定して、カレントディレクトリ配下のファイルのみをアーカイブしたいのですが、カレントディレクトリ自身の情報もアーカイブされてしまいます。ファイルのみをアーカイブすることは出来ないでしょうか?よろしくお願い致します。 tar cvf (tarファイル名) -C (ディレクトリ名) .

  • tarコマンドで

    ログインしたユーザーのホームディレクトリがカレントディレクトリで、 tar -cvf /dev/hda . というコマンドを実行した場合は、ユーザのホームディレクトリのすべてのファイルを新しくアーカイブしてhdaに書き出すという意味で良いのでしょうか?

  • tarコマンドエラー

    こんにちは。 RedhatLinux7.3上で、システムをバックアップしようとして、tarをマルチボリュームのオプションで実行しました。 バックアップ、展開のスクリプトは以下のようにしています。 ------------------------- [バックアップ] tar -c -M -b 16 -L 524288 -F "ローテートスクリプト" -psf /tmp/aaa.tar / [復元] tar -b 16 -xM -f /tmp/aaa.tar -f /tmp/aaa000.tar ------------------------- ローテートスクリプトはaaa.tarが指定サイズになったら、aaa000.tarなどにリネームしていくスクリプトです。 完成したtarファイルを展開してみたところ、以下のようなエラーが出ました。 「tar:Error exit delayed from previous errors」 ファイルは正常に展開されているようなのですが、終了コードを見ると、"2"になっています。 これはどういった意味のエラーなのか、知っている方がいたら、教えて下さい。マシンの環境は以下のとおりです。 kernel-2.4.20-13.7 tar-1.13.25-4 ファイルシステム:ext3

  • Linuxのtarコマンドについて

    Linuxのtarコマンドについてわかる方がいれば教えてほしいです。 (tarコマンドというよりはLinuxの仕様かもしれません) Linuxで以下①パターンと②パターンでコマンドを実行したときに 指定の仕方でtarファイルの作成されるディレクトリが違うのですが なぜでしょうか。 Linux初心者なので詳しく教えていただけると助かります。 共通(前準備 (#はプロンプトです)) # DIR=/tmp/hoge/2021 # ls -l ${DIR} ~ test1.txt ~ test2.txt ~ test3.txt # cd ${DIR} ①パターン # tar -cvf ${DIR}.tar ./* (アスタリスクです) # ls -l /tmp/hoge ~ 2021.tar ⇒/tmp/hoge配下にtarができる ②パターン # tar -cvf 2021.tar ./* (アスタリスクです) # ls -l /tmp/hoge ~ 2021.tar ⇒/tmp/hoge/2021配下にtarができる

  • tarでディレクトリのみをアーカイブしたい

    【質問】 Solaris8 純正のtarコマンドで、ファイルを除いてディレクトリのみをアーカイブする良い方法を模索しています。 【背景】 ディレクトリ構成をtarで抽出し、別のマシンで解凍する(/export/homeなど)際に、配下のファイルサイズが大きく時間がかかるため、抽出の際にファイルを除外しておきたい 【前提】 tarでアーカイブする際、ディレクトリを指定すると配下のファイルも再帰的にアーカイブされてしまう。 【詳細】 例えば、以下のようなディレクトリ構造のとき、 AAA/ AAA/aaa/ AAA/aaa/hoge.c BBB/ BBB/foo.txt ディレクトリのみをtarアーカイブして、 AAA/ AAA/aaa/ BBB/ という内容のtarアーカイブを作成するとき、私は以下のようなやり方をしています。 A.全抽出→解凍→ファイル消し→再抽出 # tar cf - AAA BBB | (cd /tmp/work; tar xvf -) # cd /tmp/work # find . -type f -exec rm {} \; # tar cvf /dev/rmt/0 AAA BBB B.除外リスト作成→除外リスト指定で抽出 # find AAA BBB -type f > exclude-list # tar cvfX /dev/rmt/0 exclude-list AAA BBB どちらも結果的にはディレクトリのみ抽出できるので問題はないのですが、ちょっと手間がかかります。コマンドライン1行でできる良い方法があれば教えて下さい。 # そもそも【前提】が私の思い込みかもしれないので、 # 「違うよ」という指摘があればお願いします。

  • cgywinでのtarコマンド

    初歩的な質問で申し訳ございません。 調べてみたのですが、 どうしても解決できないので お知恵をお貸しください。 cgywinをlftp利用のためwin7に導入し、 該当サーバ上にあるディレクトリ丸ごとをtarで固めて ローカルに持ってきたいのですが、 lftpでtarコマンドを使用すると 「unknown command 'tar'」 と、tarコマンド知りませんとエラーが出てしまいます。 システム変数に cgywinのbinのpathは追加しており、 あとはどうすればいいのかわかりません。。 教えてください。。

  • tarと compressと  remshの組み合わせ

    HP-UXを使用しています。 tar と compress とremshを組み合わせて、 あるディレクトリ配下のファイルを、バックアップし、圧縮し、さらに別サーバに転送したいのです。 例えば、あるディレクトリを /etc/tmpとし、別サーバのIPアドレスをxxx.xxx.xxx.xxxとし、 別サーバの保存領域が/tmpとし、圧縮したバックアップファイル名をdummy.tar.Zとします。 このとき、 下のように打っても、tarのエラーがでます。 具体的には etc/tmp配下にファイルがたくさんあるのにもかかわらずファイルが見つかりませんのようなエラーがでました。 (...のようなというのは、今、家にいるため会社で昼間見たエラーメッセージを覚えていないのです) うってみた内容    tar cvf -etc/tmp | compress -c | remsh xxx.xxx.xxx.xxx dd of=/tmp/dummy.tar.Z  構文が違うのかと思い、いろいろ順序を入れ替え、やってみましたが駄目でした。 しかし、tarとcompressとremshを組み合わせ、対象ファイルをバックアップし、圧縮し、さらに別サーバに転送できると聞いたことがあるのです。(メリットは最初のサーバに大きな容量のバックアップファイルを残さないですむこと)  今日、三時間ほど試しましたが、できませんでした。  もし、皆さんの中でやられた方がいらっしゃいましたら教えてください。

  • tar.gzが解凍できない。

    古いPCにVineLinux2.1.5を入れました。PCのSPEC上、これしか入りませんが、家庭内LANのみでLinux練習用です。Apache2.0.50を手持ちのCDから「/tmp」にコピーし、「$ ls /tmp」 で確認すると、httpd-2.0.50.tar.gz が出来ています。ところが、 $ tar zxvf httpd-2.0.50.tar.gz[Return] とすると、 「そのようなファイルやディレクトリはありません」 tar(子プロセス)エラーを回復できません:直ちに終了します。 tar:子プロセスがステータス2を返してきました。 tar:エラー終了が前のエラーから遅れました。 とのメッセージが出て、解凍できません。 「/」にコピーし直したり、ユーザー権限をroot権限に変えたりしてTryしても、同じエラーメッセージが出ます。 原因は何でしょうか? どうすれば解決できるでしょうか? 古いバージョンのlinuxで恐縮ですが、もし、何か解決のヒントをお持ちの方がおられましたら、よろしくお願い致します。

  • webminをtarからインストールできない

    CentOS4にwebminをtarファイルからインストールしようとして # tar zxvf webmin-1.340.tar.gz # cd webmin-1.340 # ./setup.sh Config file directory [/etc/webmin]: y とすると "Config directory must be an absolute path" とエラーがでて終了します。 ディレクトリがないせいなのかと思い /etc/webminをつくっても同じ結果になります。 これはどうしたらいいのでしょうか?

  • tarの互換性

    AIX5.3で、tarを使用してファイルを4mmDATにバックアップしました。そのbackupした4mmDAT tapeをRedHat Linux AS4上のDATドライブに装填し、tape上のファイルを、Linux上のファイルシステムにextractしたいのですが、どのようにすればよろしいでしょうか。 AIXで実行したコマンドは下記の通りです。 # cd /home/xxxxx-user/data # tar cvf /dev/rmt0 *.*