シェルスクリプトの中で、フォルダを圧縮するため
tar -cvzf ~
しています。このシェルをroot権限cronで毎日動かしたいのですが、試したところ、正常に圧縮されません。
名前だけは存在するのですが、ファイルサイズが20byteしかありません。
シェルスクリプトを手動で起動させた場合は正しく圧縮できます。圧縮されたファイルも1Gありました。

以前、どこかのMLにて同様の報告があり、root宛てのMailを確認するように、というアドバイスまでは乗っていたので、確認したところ、root宛てにメールが来ていませんでした。

対処方法をお教えください。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

zオプションがついているという事は、gzip圧縮込みですよね。



ファイルが生成されているという事は、tar自体は動いている可能性が高いと。

そうなると、私が思いつく可能性は2つです。

1.cronの実行時のサーチpathにgzipが無い。
2.OSが分からないので、微妙ですがBSD系のOSや、Solarisなどでは、システム標準のtarがgnu tarでは無い事が多いです。
従って、件の環境変数の絡みで、gnu tarよりも先にシステム標準のtarが呼び出されているため、zオプションが無効でうまく動いていない。

と、こんな風に推測しますが、どうでしょうか?

この回答への補足

回答ありがとうございます。
私、あせってOS書いてなかったですね。
OSはRedHat6.2J改訂版です。

which gzipにて/usr/binにある(そこからリンク張られていて実体は/binにありました)とのことでしたので、crontab -eにて
PATH=/sbin:/bin:/usr/sbin:/usr/bin
の一行を追加してみましたが、結果は同じでした。

また、selenityさんの助言に従い、tarのパスを絶対パス(/bin/tar)で書いてみましたが、結果は変わりませんでした。

手動の場合実行できて、cronからだと実行できない原因として、ファイルの所有者が関係あるのかな?と考えてみたりしています。
しかし、root権限で実行できて、rootで設定されたcronで実行できない、ということなんてあるのでしょうか?
ちなみに圧縮対象のファイルの所有者はrootではありません。

補足日時:2002/04/04 14:02
    • good
    • 0

シェルスクリプト内のtarの記述を


tar -cvzf ~ > log.txt 2>&1
のようにして、実行時のメッセージを拾って見ては如何でしょう。

何が起こっているのかの手がかりくらいは掴めるとおもいますけど。
    • good
    • 0

多分cronから実行される際の環境変数の不足が原因でしょう。


シェルスクリプト内の「tar ~」の記述で、tarコマンドをフルパスで記述すれば動きませんか?
    • good
    • 1

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qcronからtarで圧縮しようとすると、途中で終わってしまいます

サーバーはCentOS 5.3です。

以下はroot権限での話です。

コマンドラインで
/bin/tar cvzf /home/myhome/backup/var_backup.tar.gz /var
と打ち、実行すると正しく圧縮されたファイルが出来上がります。
解凍してみても問題ありません。
大きさは700MBくらいになります。

ところが同じコマンドをCronにセットして実行すると、ファイルはできるのですが
254K
というとても小さなファイルが出来上がって終わってしまいます。
解凍してみるととても中途半端なところで圧縮が終わっているみたいです。

5 0 * * * /bin/tar cvzf /home/myhome/backup/var_backup.tar.gz /var
のように書いています。

rootのcrontabなので権限の問題ということも無いと思うのですが。
別のディレクトリでも試してみたのですが同じ結果でした。

別のサーバーで同じくCentOS5.3を使っていて、同じことをやっているのですが
そちらはうまく行っているのです。

どなたか解決策などご存知でしたら教えてください。
同じような質問が過去にもあったようなのですが、未解決で終わっていました。

サーバーはCentOS 5.3です。

以下はroot権限での話です。

コマンドラインで
/bin/tar cvzf /home/myhome/backup/var_backup.tar.gz /var
と打ち、実行すると正しく圧縮されたファイルが出来上がります。
解凍してみても問題ありません。
大きさは700MBくらいになります。

ところが同じコマンドをCronにセットして実行すると、ファイルはできるのですが
254K
というとても小さなファイルが出来上がって終わってしまいます。
解凍してみるととても中途半端なところで圧縮が終わっているみたいです。...続きを読む

Aベストアンサー

>Cronにセットして実行
環境変数等の可能性が疑われます。 また、シェルで使っているコマンドも同様にパスが見つからなくて失敗することが多いです。

例えば「CAT=/bin/cat」と事前に環境変数に依存しないようにすると解決すると思います。
詳しくは、システム系のシェルを参考

Qcrontabでtarを実行した際、エラーではないものは出力されずに実行できるコマンドを教えてください

crontabでシェルスクリプトを立ち上げて自動バックアップをさせているのですが、crontabのレポートメールに
tar: Removing leading `/' from member names
と出ます。
実行内容は
tar zcvf /home/__ArchiveFolder/backup_`date +%Y%m%d`.tar.gz /home/public_html
なのですが、サイレントモードで実行というのでしょうか、このメッセージのメールを送られてこないように出来るのでしょうか?

言い換えますと、path名の頭に / があると、展開時に面倒が起こるから、/を取り除いてくれていいのですが、いちいちレポートしなくてもいいので、quietモード(manにはありませんでした)のようにするにはどうしたら良いのでしょうか?

Aベストアンサー

こんにちは。

>tar: Removing leading `/' from member names

このメッセージは、tarの標準エラー出力(2)なので、リダイレクトで取り除くことができます。


● 標準出力が、/dev/null に捨てられる。

$ tar zcvf /tmp/xxx.tar.gz /home/hoge > /dev/null
tar: Removing leading `/' from member names


● 標準エラー出力(2)が、/dev/null に捨てられる。

$ tar zcvf /tmp/xxx.tar.gz /home/hoge 2> /dev/null
/home/hoge/
/home/hoge/.bashrc
/home/hoge/.bash_profile


● crontab で指定してみる。

$ crontab -l
42 * * * * tar zcvf /tmp/xxx.tar.gz /home/hoge 2> /dev/null


● 標準エラー出力の行がメールで送られない。

Message 56:
From hoge@localhost Sat Nov 18 12:42:02 2006
X-Original-To: hoge
From: root@localhost (Cron Daemon)
To: hoge@localhost
Subject: Cron <hoge@ns> tar zcvf /tmp/xxx.tar.gz /home/hoge 2> /dev/null
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/hoge>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=hoge>
Date: Sat, 18 Nov 2006 12:42:02 +0900 (JST)

/home/hoge/
/home/hoge/.bashrc
/home/hoge/.bash_profile
/home/hoge/.bash_history
/home/hoge/.ssh/
..


参考にしてください。

こんにちは。

>tar: Removing leading `/' from member names

このメッセージは、tarの標準エラー出力(2)なので、リダイレクトで取り除くことができます。


● 標準出力が、/dev/null に捨てられる。

$ tar zcvf /tmp/xxx.tar.gz /home/hoge > /dev/null
tar: Removing leading `/' from member names


● 標準エラー出力(2)が、/dev/null に捨てられる。

$ tar zcvf /tmp/xxx.tar.gz /home/hoge 2> /dev/null
/home/hoge/
/home/hoge/.bashrc
/home/hoge/.bash_profile


● crontab...続きを読む

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

Qtar.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で恐縮ですが、もし、何か解決のヒントをお持ちの方がおられましたら、よろしくお願い致します。

古い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:エラー終了が前のエラーか...続きを読む

Aベストアンサー

gzipがインストールされてないのでしょう。
VineLinuxの古いバージョンでは、gzipが標準でインストールされてなかった記憶があります。

今更VineLinux2.1でapt-get install出来るのかどうか分かりませんが、apt-get install gzipをお試し下さい。
ダメならばインターネット上からgzipを探してきてインストールすればよいでしょう。

Qレッドハットのバージョン確認方法

自分のサーバで使用しているREDHATのバージョン確認はどうすればいいのでしょうか?

more /etc/issue
とやっても英文しか出てきませんでした。

uname -all
でもカーネルのバージョンは出るのですが、REDHATのバージョンは出ませんでした。

Aベストアンサー

> more /etc/issue
> とやっても英文しか出てきませんでした。

その英文にはRedHatのバージョンは書いてなかったのですか?
書いていなかったとしたら、管理者により編集されている可能性
がありますね。

cat /etc/redhat-release

ではいかがでしょう?
やっぱり英文ですけど。

rpm -q redhat-release

でもいいかも

Qtarコマンドのリターン値

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元はディレクトリ配下の複数のファイルを*で圧縮しようとしています。

Aベストアンサー

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から読み込む

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qcrontabの設定ができない(編集画面が出ない)

CentOS5.2を使っています。
crontabの設定を行おうと、
# chkconfig --list crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
で確認後、$ crontab -e  としましたが、
no crontab for aaabbb - using an empty one と出て、編集ファイルが表示されません。
$ crontab -l  とすると no crontab for aaabbb と出、
# crontab -l  も    no crontab for root  となります。  
念のため # chmod 777 /etc/crontab としてみましたが、結果は同じです。

$ less /etc/crontab でファイルを開くと
------------------------
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
/etc/crontab (END)
----------------------
となっています。
Webで設定例を検索すると、no crontab for aaabbb - using an empty one の下に
crontab: installing new crontab と出ると記載されているのですが、
私の場合、このような表示や動きは出ませんが、どのようにして crontab を設定していくのでしょうか。どうか宜しくお願いします。

CentOS5.2を使っています。
crontabの設定を行おうと、
# chkconfig --list crond
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
で確認後、$ crontab -e  としましたが、
no crontab for aaabbb - using an empty one と出て、編集ファイルが表示されません。
$ crontab -l  とすると no crontab for aaabbb と出、
# crontab -l  も    no crontab for root  となります。  
念のため # chmod 777 /etc/crontab としてみましたが、結果は同じです。

$ ...続きを読む

Aベストアンサー

>/etc/crontab などを編集するのではなく、この空のファイルに設定内容を書いていく、ということでしょうか?

そうです。
/etc/crontab でのタイマー起動と、crontabコマンドによるタイマー起動はそれぞれ別物です。
システムの運用系と、ユーザーごとの作業で使い分けられています。


人気Q&Aランキング