cronでのバックアップシェルに権限エラーが発生する問題について

このQ&Aのポイント
  • hetemlというレンタルサーバでcronに登録したバックアップ用のシェルスクリプトで権限エラーが発生しています。
  • エラーメッセージによると、/home/sites/heteml/users/xxx/db_bakkup.shへのアクセス権がないようです。
  • アクセス権の問題を解決する方法や原因について、ご教授いただけないでしょうか?
回答を見る
  • ベストアンサー

cronでバックアップsh

現在、hetemlというレンタルサーバでバックアップ用のシェルをcron登録しているのですが、 権限エラーが出てしまいます。何の権限エラーなのか解らないのですが、 どなたかご存知ないでしょうか? [エラーメッセージ] /bin/sh: /home/sites/heteml/users/xxx/db_bakkup.sh: Permission denied [シェル] #!/bin/sh # ---------- 設定 ---------- # バックアップ元のデータベース db_host=xx db_name=xx db_user=xx db_pass=xx # バックアップ先のディレクトリ・ファイル bk_file=/xx/bak.sql # ---------- ファイル名を設定 ---------- # ファイル名を設定 file_temp=$bk_file.sql # ---------- バックアップ処理 ---------- # バックアップ先のディレクトリに移動 cd $bk_dir if [ $? != 0 ]; then echo "Backup directory does not exist." exit 1 fi # データベースをダンプ mysqldump -h$db_host $db_name -u$db_name -p$db_pass --opt > $bk_file if [ $? != 0 -o ! -e $file_temp ]; then echo "Cannot dump database." exit 1 fi exit 0 ------------------------------------ 有識者の方、ご教授お願い致します。

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

  • ベストアンサー
  • 0909union
  • ベストアンサー率39% (325/818)
回答No.2

だれが吐き出しているエラーであるか記載しなとだめですよね。 cronデーモンのログに出ているのか、OSのシステムログなのか? ちなみにそれぞれ見ましたか? それによって「権限が無い」の意味合いが違うと思います。 cronであれば、実行者権限の設定を変えること。 http://search.yahoo.co.jp/search?b=1&n=10&ei=UTF-8&fr=ie8sc&p=Linux+cron+%E8%A8%AD%E5%AE%9A%E3%81%AE%E4%BB%95%E6%96%B9 で設定の仕方がでていますね。設定された実行ユーザーで行うので、その設定されているユーザーに実行権がないと、cronデーモンでは「権限が無い」とでると思われるが・・・・ db_bakkup.sh=[シェル] の内容であれば、SHでこのシェルファイルの実行で「権限が無い」と言っている。つまり、No1さんが言うとおり 777 755 775 にすればいいことになる。いずにせよ、私ならまず設定をしっかり把握する事からお勧めする。それからでも遅くはないですよ。

HYSTER
質問者

お礼

#1さん,#2さんレス有難うございます。 権限エラーに関してはshファイルのパーミッションを777に設定することで解決しました! その後もハマリましたが、 ・shファイルをFTPソフトで転送時にアスキーモードで転送する ・mysqldump構文の-pの後ろにスペースを入れない (mysqldump -h $db_host $db_name -u $db_name -p$db_pass --opt > $bk_file ) という対処を行ったところ、無事バックアップが取れるようになりました。 この度はどうも有り難うございました!

その他の回答 (1)

  • gtx456gtx
  • ベストアンサー率18% (194/1035)
回答No.1

/home/sites/heteml/users/xxx/db_bakkup.sh のパーミッションが不足している? 取りえず、全ての権限を与える「777」を与えてcronで実行したらどうなります? >mysqldump -h$db_host $db_name -u$db_name -p$db_pass --opt > $bk_file 「mysqldump」のパスが指定されていないのも気になりますが、777でどうなるかです。

関連するQ&A

  • cronでバックアップ

    centファイルサーバーA からWindowsServerファイルサーバーへ バックアップを取る際に cronを使ってシェルスクリプトを書いてバックアップをすればいいというところまでは調べましたが、 シェルスクリプトの中に記述するコマンドは何を使用したらいいでしょうか? 最初に全てのファイルをバックアップ、その後毎日1回差分バックアップを計画しています。 またグループでアクセス制御をしているディレクトリもあります。 選択肢が多すぎて、どれが比較的シンプルでスマートなやり方なのかの手がかりにしたいと 思っております。 よろしくお願いします

  • cronでGPGが使えない

    次のようなデータベースをバックアップするシェルスクリプトを作成しました。 #! /bin/sh BACKUP_DIR=/home/backup FILE_NAME=testdb`date +%Y%m%d`.sql mysqldump -udumpuser -pパスワード testdb > ${BACKUP_DIR}/${FILE_NAME} gpg -r ○○@○○ -e ${BACKUP_DIR}/${FILE_NAME} rm -rf ${BACKUP_DIR}/${FILE_NAME} sqlbackup.shと名前を付けてrootで実行してみたところ問題なくバックアップできました。 しかし、/etc/crontabに 0 0 * * * root /bin/sqlbackup.sh と記述して実行してみたところ gpg: ○○@○○: skipped: public key not found となってしまいました。 rootで「gpg --import」で○○@○○の公開鍵をインポートし、「gpg --edit-key」で信頼度をI trust ultimatelyにしています。 どのような原因が考えられますでしょうか。 よろしくお願いいたします。

  • SQL文について

    お世話になります。 POST通信で受け取った内容をデータベースに書き込もうとすると 書き込みに失敗してしまいます。 namespace portfolio; require_once dirname(__FILE__) . '/Bootstrap.class.php'; use portfolio\lib\Database; $db = new Database( Bootstrap::DB_HOST, Bootstrap::DB_USER, Bootstrap::DB_PASS, Bootstrap::DB_NAME); if($_POST !== false){ $dataArr = $_POST; $problem = $dataArr['problem']; $name1 = $dataArr['name1']; $name2 = $dataArr['name2']; $name3 = $dataArr['name3']; $name4 = $dataArr['name4']; } $sql = "INSERT INTO hokuto_problem (problem,name1,name2,name3,name4) VALUES (".$problem.",".$name1.",".$name2.",".$name3.",".$name4.")"; $res = $db->execute($sql); var_dump($res); if($res === true){ echo "処理が成功しました"; }else{ echo "書き込みに失敗しました"; } 上記処理をしようとしたら書き込みに失敗してしまいます Bootstrap.phpでは namespace portfolio; require_once dirname(__FILE__) . './../vendor/autoload.php'; class Bootstrap{ const DB_HOST = 'localhost'; const DB_NAME = 'hokuto'; const DB_USER = 'root'; const DB_PASS = 'root'; const APP_DIR = '/Applications/MAMP/htdocs/DT/'; // const TEMPLATE_DIR = self::APP_DIR.'templates/member/'; const CACHE_DIR = false ; const APP_URL = 'http://localhost:8888/DT/'; const ENTRY_URL = self::APP_URL . 'portfolio/'; public static function loadClass($class){ $path = str_replace('\\', '/', self::APP_DIR . $class . '.class.php'); require_once $path; } } spl_autoload_register( [ 'portfolio\Bootstrap', 'loadClass' ] ); そして、Database.class.phpにおいては amespace portfolio\lib; class Database { public $db_con = null; public $db_host = ''; public $db_user = ''; public $db_pass = ''; public $db_name = ''; public function __construct($db_host, $db_user, $db_pass, $db_name) { $this->db_con = $this->connectDB($db_host, $db_user, $db_pass, $db_name); $this->db_host = $db_host; $this->db_user = $db_user; $this->db_pass = $db_pass; $this->db_name = $db_name; } private function connectDB($db_host, $db_user, $db_pass, $db_name) { $tmp_con = mysqli_connect($db_host, $db_user, $db_pass, $db_name); if ($tmp_con !== false) { return $tmp_con; } else { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } } public function execute($sql) { return mysqli_query($this->db_con, $sql); } のコードを書いています 初心者に質問で、非常に見辛い面は承知の上で 大変心苦しいですが、何卒、ご回答いただけると幸いです

    • 締切済み
    • PHP
  • mysqlの自動バックアップ

    crontabを実行してmysqlのバックアップを取ろうとしています。 まず、以下のunixコマンドでバックアップできることを確認しました。 mysqldump -u *** -p*** abc_db > /file/dump/db_backup_`date +%Y%m%d-%H%M%S`.sql これをcrontabで実行するためにphpファイルにして以下のように記述しました。 <?php $output = shell_exec('mysqldump -u *** -p*** abc_db > /file/dump/db_backup_`date +%Y%m%d-%H%M%S`.sql'); echo "<pre>$output</pre>"; ?> このファイルを実行すると以下のメッセージが返されます /***/sql_backup.php: line 1: ?php: そのようなファイルやディレクトリはありません /***/sql_backup.php: line 2: syntax error near unexpected token `(' /***/sql_backup.php: line 2: `$output = shell_exec('mysqldump -u *** -p*** abc_db > /file/dump/db_backup_`date +%Y%m%d-%H%M%S`.sql');' phpでコマンドを実行するにはshell_execを使うとあり、試してみたのですが、こういう方法では使えないのでしょうか? 最終的にはcrontabを使ってmysqlのバックアップが取れれば良いので、他に方法があるようでしたら教えて頂ければ助かります。 宜しくお願いします。

    • 締切済み
    • PHP
  • Shellのパターンマッチについて

    Linux初心者で正規表現やパターンマッチの方法にあまり詳しくない者です。 以下はWeb上で公開されているiscsiの設定を行うシェルのサンプルです。 # -- ここから #!/bin/sh #iscsidev.sh BUS=${1} HOST=${BUS%%:*} LUN=`echo ${BUS} | cut -d":" -f4` file="/sys/class/scsi_host/host${HOST}/device/session*/iscsi_session*/targetname" target_name=`echo $(cat ${file}) | cut -d":" -f2` if [ -z "${target_name}" ]; then exit 1 fi echo "${target_name} ${LUN}" # --ここまで サンプルをコピペしてそのまま動かしたのですが、きちんと動作していないようだったので、 1行ずつ端末上で実行し、確認したところ、 file="/sys/class/scsi_host/host${HOST}/device/session*/iscsi_session*/targetname" で指定している部分で該当するファイル・ディレクトリがないエラーになっていました。 実際のディレクトリは/sys/class/scsi_host/host0~9のようになっているのに対し、 この設定では${HOST}の部分がうまくいってないようで /sys/class/scsi_host/host/device~と、「~hostの後が任意の数字」のように意図 しているにもかかわらず、そのようになっていないようです。 このような場合、 BUS=${1} HOST=${BUS%%:*} LUN=`echo ${BUS} | cut -d":" -f4` の部分はどのように修正したらよいでしょうか?

  • crontabでDBのバックアップについて

    OS:Redhat ES 2.1 DB:PostgreSQL7.2 という環境のパソコンを2台(A,B)を用意し、 日常業務ではAを更新していき、 深夜にAの内容をBにバックアップする。 といった処理を構築しております。 backup.shというシェルで、 BからAにssh接続し、PostgreSQL内のDBの ダンプを書き出し、 rsyncでダンプファイルをBへコピーし、 B内でリストアするという処理です。 シェルファイルを直接実行した場合は、 問題なく動作するのですが、 crontabに登録して実行させると、 rsyncまでは動作しているのですが、 データベースへのリストアで処理が止まってしまい、 うまくリストアできません。 /etc/crontabファイル内のPathに、 /usr/local/pgsql/binとPostgreSQLのパスも 追加しているのですが、うまく動作せず、 なにが原因かよくわかりません。 ご教授願います。

  • CRON起動できない

    Solaris+Cで開発しています。 作成したプログラムを、CRON起動で定周期で起動させたいのですが、  1.実行ファイルを作成  2.実行ファイルを起動するシェルを作成  3.作成したシェルをXX時XX分に起動するようにcrontabに設定 ・・・のようにしたのですが、以下のようなエラーでうまく動作しません。(proc_Aは実行ファイル名) ld.so.1: proc_A: fatal: libclntsh.so.8.0: open failed: No such file or directory Killed ちなみに、上記2で作成したシェルを直接たたくと、正常に動作します。 どのように対処すればよいか、ご教授願います。

  • cronでwgetツールを自動化したい

    大学でvine Linuxを利用しています。 5つのサイトのソースファイルを毎日自動収集するようなシェルスクリプトを組みたいと思っています。 (/home/name/bin/の下に日付のディレクトリを作成してその中に5つを保存します。) 本や色々なサイトを参考にして、 #!/bin/sh d=`date +%m%d` * 7 * * * wget -P /home/name/bin/${d}/ http://A * 7 * * * wget -P /home/name/bin/${d}/ http://B * 7 * * * wget -P /home/name/bin/${d}/ http://C * 7 * * * wget -P /home/name/bin/${d}/ http://D * 7 * * * wget -P /home/name/bin/${d}/ http://E これをファイル.shとして保存して、 crontab /home/name/bin/ファイル.sh でcronに読み込ませたらいけるかと思ったんですがダメでした。 (crontab -eだとvimエディタになる設定のようなのでファイルを作成してから登録したいです) 初めてのシェルスクリプトで色々試しても上手くいかなくて困っています。 どなたか御指導よろしくお願いします。

  • シェルでftp接続によるファイル取得について

    以下のようなシェルスクリプトを作成しましたが、 (file-name) get: No such file or directory (file-name) done: No such file or directory のエラーメッセージが出てしまい、うまくいきません。 OSはLinux(FedoraCore4)です。 どうやらファイル名の取得がうまくいかず、エラーになっている 様です。 試しに直接ファイル名を指定して書くと、無事ファイルを 取得できます。 エラーの原因がお分かりになる方、どうぞ宜しくお願い致します。 ----------------------------------------------- #!/bin/sh cd /local_test/log/ ftp -n xxx.xxx.xxx.xxx<< _EOF user test_user test_pass cd /test/log/ ascii prompt for i in *.log do chmod u+r $i get $i chmod u-r $i done bye _EOF exit 0 -----------------------------------------------

  • シェルからサービスの起動

    こんばんは。 シェル(bash)からFTPサービスを起動したいのですが、 シェル実行時にエラーとなってしまいます。 [root@HOST1 sh]# vi ftpstart.sh #------------------------------------- # Start Up FTP #------------------------------------- #!/bin/sh $service vsftpd start >> ${LOG_NAME} ・ ・ [root@HOST1 sh]# chmod 777 ./ftpstart.sh 実行時にエラー発生: [root@HOST1 sh]# ./ftpstart.sh 500 OOPS: vsftpd: cannot open config file:start ちなみに「service vsftpd start」を単発で実行すると 問題なくサービスは起動します。 シェルの記載が間違えているのでしょうか・・。 よろしくお願いします。