人に聞けない痔の悩み、これでスッキリ >>

perl プログラミング 2日目の初心者です。
以下のようなスクリプトを書いて test.cgi とかで

$del_count = unlink glob("msg-*.txt");

保存し、ブラウザーでアクセスすると、ちゃんと
ファイルが削除されるのですが、

シェル上で実行すると、以下のようなメッセージ

glob failed (child exited with status 1) at test.cgi line 5.

とか出て削除ができないのです。
パーミッションも 755 とかで試したのですが、
どうしてなのでしょうか・・・うんうん煮詰まって
います。

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

A 回答 (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()はきちんと動きます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/10/15 11:07

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. …

この回答への補足

URLまでご紹介いただいてありがとうございます。
教えていただいコマンドで調べてみたら、

This is perl, version 5.005_03 built for i386-freebsd

と出ましたので、バージョンはたぶん5 のようです。
それでも、IEでアクセスするときちんと削除できる
ので、やはりシェル上での実行権限にからんでくる
ような気がしてます。しかし原因がわからない。。。
こんなところで詰まって何日も先に進まないのが
悔やまれます。

補足日時:2001/10/11 11:35
    • good
    • 0

自信はありませんが、


シェル上で動かないのは、シェルスクリプトとして
実行されてしまっているからかもしれません。

シェル上で明示的に /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で動かす、という設定がされている
ことになります。
-------------------------

この回答への補足

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

補足日時:2001/10/09 18:29
    • good
    • 0

scriptの実行ユーザが違うからではないですか?



cgi経由で実行する場合、scriptの実行者はhttpdの実行uidで実行されます(wwwとかnobodyとかdaemonとか・・・httpdの設定によります)。

それに対してshellから実行する場合、現在のuidで実行されるのですからパーミッションが755の場合、ファイルオーナーでないと削除できません。

shellから該当ファイルをls -alFとかして、ファイルオーナーを確認してみてはいかがでしょうか?

この回答への補足

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

補足日時:2001/10/09 18:28
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/10/15 11:08

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

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

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

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

Qunlinkで削除されないのは?

質問させてください。
Windows2000、IIS、ActivePerl 5.6.1.638で動作させているのですが、
CGI内でunlinkを使ってファイルを削除できません。

-------------
unlink('hogehoge.txt');
-------------

みたいに書いています。
ちなみにhogehoge.txtは同CGIの中で生成しているものです。

エクスプローラーから手動で削除しようとすると共有違反になります。
World Wide Web Publishing Serviceを停止すると、手動で削除できるようになります。

どうぞご教授お願いします。

Aベストアンサー

フルパスで指定してみてはどうでしょう?

また、$! 変数にメッセージがセットされていませんか?

unlink('hogehoge.txt') or
print <<EOT;
Content-type: text/html

<H3>$!</H3>
EOT

Qunlinkでどうしてもファイルが削除できない!!

お世話になります。
いろいろとネットで情報を探しているのですが、どうしても解決しません。

ローカルなapacheのサーバにファイルをアップロードし、指定のファイルを削除するプログラムを作成しています。

プログラムファイルのあるディレクトリの下に"files"というディレクトリがあり、その下に、アップロードした日付でディレクトリ(例:"200511171010")をプログラム側で作成し、その下にファイルをアップロードするものです。

編集するプログラムで、選択したファイルを削除するというものです。

サーバは、Windows2000,MySQL,Apacheです。プログラムはEUCで書かれています。

・フォルダを作成するプログラム
$uniq = $dir_y.$dir_m.$dir_d.$dir_h.$dir_i;
$uploaddir = "./files/$uniq/";

//ファイルのアップロード処理
if($_FILES['file1']['name'] != ""){
mkdir("$uploaddir");
$ufile[1] = $_FILES['file1']['name'];
$ufile[1] = str_replace("'","’","$ufile[1]");
$uploadfile = $uploaddir.$ufile[1];
move_uploaded_file($_FILES['file1']['tmp_name'],mb_convert_encoding($uploadfile, "SJIS", "EUC-JP"));
}

・ファイルを削除する部分
$rslt = unlink("./files/$uniq/$t[$i]");

です。

エラーは、
Warning: unlink(./files/20051115195407/購入書籍.xls) [function.unlink]: No such file or directory in C:\Program Files\Apache Group\Apache2\htdocs\shuchi\edit_ok.php on line 103

です。ファイル自体はあるのですが、削除されていません。

パーミッションとかも、フォルダを作成するときとか、いろいろいじってみたのですが解決しませんでした。

何かわかれば是非、教えてください。すみませんがよろしくお願いいたします。

お世話になります。
いろいろとネットで情報を探しているのですが、どうしても解決しません。

ローカルなapacheのサーバにファイルをアップロードし、指定のファイルを削除するプログラムを作成しています。

プログラムファイルのあるディレクトリの下に"files"というディレクトリがあり、その下に、アップロードした日付でディレクトリ(例:"200511171010")をプログラム側で作成し、その下にファイルをアップロードするものです。

編集するプログラムで、選択したファイルを削除するというものです。...続きを読む

Aベストアンサー

日本語ではないファイル名ではどうなりますか?


人気Q&Aランキング