• ベストアンサー

ファイルの削除について ( unlink )

perl プログラミング 2日目の初心者です。 以下のようなスクリプトを書いて test.cgi とかで $del_count = unlink glob("msg-*.txt"); 保存し、ブラウザーでアクセスすると、ちゃんと ファイルが削除されるのですが、 シェル上で実行すると、以下のようなメッセージ glob failed (child exited with status 1) at test.cgi line 5. とか出て削除ができないのです。 パーミッションも 755 とかで試したのですが、 どうしてなのでしょうか・・・うんうん煮詰まって います。

  • naru
  • お礼率76% (155/202)
  • CGI
  • 回答数4
  • ありがとう数5

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

  • ベストアンサー
  • ide1
  • ベストアンサー率77% (7/9)
回答No.4

おっしゃるように権限でしょうか...。 だとすると、シェルでWebサーバの実行ユーザ(多分wwwかnobody)を使って動かすとうまくいくのでしょうか? ※マシン管理者の協力がいりますが...。 ------------------------ globe() と unlink() を分けるとどちらでエラーに なるのでしょうか? #!/usr/local/bin/perl $a = glob("msg-*.txt"); $b = unlink("msg-1.txt"); ------------------------ ほとんど可能性はないですが、リソース不足(メモリ、DISK)ということもあるかもしれません。 ちなみに私のPerlの環境は This is perl, v5.6.1 built for sun4-solaris です。 glob(),unlink()はきちんと動きます。

naru
質問者

お礼

本件、無事解決しました。 親身になってご回答くださり、本当にありがとうござい ました。 どうやってもラチあかないのでサーバーの管理者に 泣きをいれたところ、なにやら設定に問題があった ようです。 ユーザーが同時にアクセスできるファイル数を2倍に した、とかでちゃんと削除できることを確認しました。 ・・・こんな些細なことにとにかく何日も時間を 費やしてしまいましたが、これも経験になりました。 気持ちのこもったアドバイスに、感謝いたします。

その他の回答 (3)

  • ide1
  • ベストアンサー率77% (7/9)
回答No.3

Perlのバージョンがperl4 ということはないでしょう か? glob()はPerl5から追加されたようですので。 調べましたところ、参考URL「Perl日本語マニュアル」 の下の方に表があり1番先頭のの「Perl5で追加された 新機能等」に書いてありました。 perlのバージョンは -v オプションでわかります。 例えば /usr/local/bin/perl -v です。 ------------------------ なお、"msg-*.txt" のモードが何であれ、 エラーにはならないです。しかし、"msg-*.txt" のパーミッションは666 が妥当です。 ------------------------ 参考ですが、<*>を使うと、glob()と同様のことを 行えます。 $del_count = unlink <msg-*.txt> ; ただし、<*> を使えない関数があるかもしれません。 その場合、glob()を使わざるを得ないと思います。 できるだけglob()を使った方がプログラムの保守が 楽になるように思えます。

参考URL:
http://www.harukaze.net/~mishima/perl/man/index.html
naru
質問者

補足

URLまでご紹介いただいてありがとうございます。 教えていただいコマンドで調べてみたら、 This is perl, version 5.005_03 built for i386-freebsd と出ましたので、バージョンはたぶん5 のようです。 それでも、IEでアクセスするときちんと削除できる ので、やはりシェル上での実行権限にからんでくる ような気がしてます。しかし原因がわからない。。。 こんなところで詰まって何日も先に進まないのが 悔やまれます。

  • ide1
  • ベストアンサー率77% (7/9)
回答No.2

自信はありませんが、 シェル上で動かないのは、シェルスクリプトとして 実行されてしまっているからかもしれません。 シェル上で明示的に /usr/local/bin/perl test.cgi としても動きませんか? (ただし環境によっては /usr/local/bin/perl では なく、例えば/usr/bin/perl のようにしないといけ ません。) もし、これで動き、かつ、ファイルのモードがあって いるのでしたら、test.cgi の1行目が間違っていると 思います。 UNIXのスクリプト(perl,sh,csh,awk,sedなど)では、 1行目にスクリプトを実行するコマンドのパスを記述 しますが、perl でしたら、次のようになっている必 要があります。 (記述例) #!/usr/local/bin/perl ------------------------- ちなみに、ブラウザで動く理由は、Webサーバの設定で、 CGIは全てPerlで動かす、という設定がされている ことになります。 -------------------------

naru
質問者

補足

おっしゃるように、パスをしっかり書いて、かつ 実行ユーザーを確かめてやってみました。 やはり消えないようです。 Shell 上で、rm msg-*.txt とやるとちゃんと消える ようです。 どうもありがとうございました。もうちょっと がんばってみます。

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.1

scriptの実行ユーザが違うからではないですか? cgi経由で実行する場合、scriptの実行者はhttpdの実行uidで実行されます(wwwとかnobodyとかdaemonとか・・・httpdの設定によります)。 それに対してshellから実行する場合、現在のuidで実行されるのですからパーミッションが755の場合、ファイルオーナーでないと削除できません。 shellから該当ファイルをls -alFとかして、ファイルオーナーを確認してみてはいかがでしょうか?

naru
質問者

お礼

本件、解決しました。 アドバイスくださり、本当にありがとうございました。 どうやってもラチあかないのでサーバーの管理者に 泣きをいれたところ、なにやら設定に問題があった ようです。

naru
質問者

補足

おっしゃるように、実行ユーザーを確かめてみました。 ログインユーザーと間違いはありません。 ちなみに、Shell 上で、rm msg-*.txt とやると きっちり消えるようです。 どうもありがとうございました。もうちょっと がんばってみます。

関連するQ&A

  • unlink「許可がありません」となり、消せない・・・

    PHP初心者です。 PHP4.2xです。 サーバーにアップしてあるログファイル(data.log)をPHPの操作で削除したいのですが・・・ $file = './data.log'; unlink($file); で消そうとすると、 Warning: unlink(./data.log): 許可がありません in /home/xxxx/xxxx/xxxx.com/httpdocs/xxxx/test.php on line 6 と表示されます。 ファイルのパーミッションは777にしています。 おそらくphp.iniの設定かセーフティモードがどうのこうのじゃないかなぁ・・・とは思っていますが、具体的にはどこをどうしたらいいのか分かりません。 どなたかアドバイス頂けないでしょうか・・・? どうぞよろしくお願いします!!

    • 締切済み
    • PHP
  • unlinkで削除されないのは?

    質問させてください。 Windows2000、IIS、ActivePerl 5.6.1.638で動作させているのですが、 CGI内でunlinkを使ってファイルを削除できません。 ------------- unlink('hogehoge.txt'); ------------- みたいに書いています。 ちなみにhogehoge.txtは同CGIの中で生成しているものです。 エクスプローラーから手動で削除しようとすると共有違反になります。 World Wide Web Publishing Serviceを停止すると、手動で削除できるようになります。 どうぞご教授お願いします。

    • ベストアンサー
    • Perl
  • PHP 削除やコピーが出来ない

    PHP 削除やコピーが出来ない $rcd = unlink("test.txt"); $rcd = `rm test.txt`; $rcd = exec('test.txt'); 上記のように、削除コマンドを実行しても削除されない。 コピーコマンドも、同じくで copy("hoge.txt", "hoge.dat"); fcopy("hoge.txt", "hoge.dat", TRUE); `cp hoge.txt hoge.dat` と、やってみたが削除対象ファイルなどに変化はありません。 ちなみに、削除対象ファイルのパーミッションは、644。 PHPファイルは、755. レンタルサーバーを、二つほど変えてみたが同じでした。 エラーを表示することも無かったので、何が悪いのかさっぱり分かりません。 何か、よい方法を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • バッチ処理 特定ファイルを除く削除

    環境:XP pro SP3 「test.txt」を基本ファイルとして残しておき、 変数を使って「test20090401.txt」というように、 バッチ処理をした日付が名前に入るように毎日自動コピー を作成しまして、加えて、8日目以降 1週間前の ファイルを自動削除したいのですが、基本の「test.txt」 は残しておきたいのです。 以下の処理だと「test.txt」まで削除されてしまうのですが、 他フォルダへの移動退避以外に「test.txt」を残し、 1週間前のファイルを削除する方法をご教授頂きたく お願い致します。 set yyyymmdd=%date:~-10% set yyyymmdd=%yyyymmdd:/=% set LOG_COUNT_LIMIT=7 cd c:\temp copy test.txt test%yyyymmdd%.txt for /f "skip=%LOG_COUNT_LIMIT%" %%a in ('dir /b /o-n *.txt') do (del %%a)

  • unlink が余計に働いてエラーメッセージ

    お世話になります。 PHPを学んでいるものです。 開発環境は、Pleiades3.5のPHPを使っています。 やりたいことは、画像データのアップロード後の仮置きファルダの掃除です。 しかし、以下のコードでやると、「Warning: unlink(images/upload/.) [function.unlink]: Permission denied in C:\xampp\htdocs\root\manager_item_edit03.php on line 530」が2つ出てきます。 if( $handle = opendir(PRE_IMAGE_DIR) ){ while( ($file=readdir($handle)) == true ): if( file_exists(PRE_IMAGE_DIR.$file) ){ unlink(PRE_IMAGE_DIR.$file); } endwhile; closedir($handle); } ただ、目に見えるファイル(事前に無駄なファイルをいくつか置いてみました)はすべて削除されています。つまり、私から見ると、unlinkが余計に働いたことでエラーが出ている状況です。 念のため、unlinkの前に下記のコードを挿入して、何のファイルか見てみたところ、「.」、「..」というピリオド(!?)だけのファイル名があるようです。 ?> <pre> <?php echo $file; ?> </pre> <?php 皆様で、このエラーを回避する方法や、そもそも何のファイルなのか、ご存知であればご教示をください。お願いします。

    • ベストアンサー
    • PHP
  • phpでファイルが削除できない

    こんにちは。 ファイル名の書かれたdir.txtを開いて、その中から1日以上経過したファイルを削除するtime.phpを作成しようと思っています。 実行してみると、24時間経過したファイルがあっても 「Warning: unlink() [function.unlink]: Permission denied in C:\Program Files\xampp\htdocs\test\time.php on line 33」 というエラーがでて削除できない 実行結果にprintするように指定していない$imaの数値「1128673152」が表示される。 のですが、どこに間違いがあるのでしょうか? time.phpの内容 ---------------------------------------------------------------------- <html> <body> <?php // ファイルを読み込み専用でオープンする $fp = fopen('dir.txt', 'r'); // 終端に達するまでループ while (!feof($fp)) { // ファイルから一行読み込む $line = fgets($fp); $line = rtrim($line); // ファイルの更新時間を調べる $kousin = filemtime("$line"); // 今の時刻 $ima = time(); // 経過時間を計算する $keika = $ima - $kousin; // 出力する print $line; print "<br>\n"; print $ima; print "<br>\n"; print $kousin; print "<br>\n"; print $keika; print "<br>\n"; clearstatcache(); if ( $keika > 86400 ) { unlink( "$file" ); } } // ファイルをクローズする fclose($fp); ?> </body> </html> ----------------------------------------------------------------------

    • ベストアンサー
    • PHP
  • ファイルを検索して削除する

    /www 以下のディレクトリーに aaa.txt というファイルが存在する場合、 そのファイルが存在するディレクトリー内の全ての ***.txt を削除したいです。 find /www -name aaa.txt | xargs rm だと、aaa.txt だけの削除になります。 以下も考えましたが、これだと検索対象ディレクトリーが /www だけになります。 #!/bin/bash if test -e /www/aaa.txt then rm -f /www/*.txt fi どのように記述するとよいでしょうか。

  • 会員制CGIで自動作成したファイルの所有者

    会員制のCGIを作成しておりまして ログファイルとして、ログイン名.txtというファイルを自動作成してます。 もうすぐ完成で、このままでもそれほど問題ではないのですが、ファイルを整理したい時に困るかなと思い質問させて頂きます iswebサーバにアップして ファイルが作成される事は確認しました。 確認後、削除しようと思ってもオーナーが違うので FTPから削除できないようですが 削除するにはどんな方法があるでしょうか?(この場合パーミッションも変えられませんよね) スクリプト中に削除画面を作って、unlinkで削除する記述をし、ブラウザから削除作業をするようにすれば大丈夫でしょうか。 基本的な事なのかもしれませんが、自己流でやってますので知識が乏しくお知恵を貸してください。

    • 締切済み
    • CGI
  • WindowsXP(Apache2.x+ActivePerl)

    Apache1.x系からApache2.x系に切り替えたのですがなぜかCGIが動きません・・・ FileがあるはずなのにFileがないといってくるんですが、どこがおかしいんでしょうか? -------------------------------------------------- (OS 2)指定されたファイルが見つかりません。 : Failed to read cgi file ./cgi-bin/count_txt.cgi for testing (OS 2)指定されたファイルが見つかりません。 : don't know how to spawn cmd child process: C:/Server/web/public_html/index.html -------------------------------------------------- とでてきます・・・ /cgi-bin/count_txt.cgiは -------------------------------------------------- http://www.01nni.com/free-b_4.htmlのtextカウンターです・・・ 設定は1行目を#!C:/Server/Perl/bin/perl.exeに変更しました・・・ -------------------------------------------------- 説明のとおりHTMLにはSSIで埋め込みますので -------------------------------------------------- <!--#exec cmd="./cgi-bin/count_txt.cgi"-->入力してあります。 -------------------------------------------------- ちなみにほかのSSIは動作しています・・・ なにか原因がわかりましたらアドバイスお願いします<m(__)m>

    • 締切済み
    • CGI
  • MS-DOSでのファイル/フォルダ一括削除

    以下のようなフォルダ、ファイルがあるとし、LOGDIR下にある「200803」の文字列を 含まないファイル及びフォルダをDOSコマンド(Win2003)で削除(できれば一括で) する方法を模索しています。 Cドライブ   |   |   +LOGDIR      |      +---LOG20080228_084539    <--- 削除対象ディレクトリ      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      +---LOG20080229_101553    <--- 削除対象ディレクトリ      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      +---LOG20080301_132059    <--- 削除対象ディレクトリでない      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      +---LOG20080302_185945    <--- 削除対象ディレクトリでない      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      |      |-----test20080229_085523.txt    <--- 削除対象ファイル      |      |-----test20080229_092310.txt    <--- 削除対象ファイル      |      |-----test20080301_153859.txt    <--- 削除対象ファイルでない      | 方法をご存知の方、いらっしゃいませんか?

専門家に質問してみよう