- ベストアンサー
ファイルの削除について ( unlink )
perl プログラミング 2日目の初心者です。 以下のようなスクリプトを書いて test.cgi とかで $del_count = unlink glob("msg-*.txt"); 保存し、ブラウザーでアクセスすると、ちゃんと ファイルが削除されるのですが、 シェル上で実行すると、以下のようなメッセージ glob failed (child exited with status 1) at test.cgi line 5. とか出て削除ができないのです。 パーミッションも 755 とかで試したのですが、 どうしてなのでしょうか・・・うんうん煮詰まって います。
- みんなの回答 (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()はきちんと動きます。
その他の回答 (3)
- ide1
- ベストアンサー率77% (7/9)
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までご紹介いただいてありがとうございます。 教えていただいコマンドで調べてみたら、 This is perl, version 5.005_03 built for i386-freebsd と出ましたので、バージョンはたぶん5 のようです。 それでも、IEでアクセスするときちんと削除できる ので、やはりシェル上での実行権限にからんでくる ような気がしてます。しかし原因がわからない。。。 こんなところで詰まって何日も先に進まないのが 悔やまれます。
- ide1
- ベストアンサー率77% (7/9)
自信はありませんが、 シェル上で動かないのは、シェルスクリプトとして 実行されてしまっているからかもしれません。 シェル上で明示的に /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 とやるとちゃんと消える ようです。 どうもありがとうございました。もうちょっと がんばってみます。
- alfeim
- ベストアンサー率58% (114/195)
scriptの実行ユーザが違うからではないですか? cgi経由で実行する場合、scriptの実行者はhttpdの実行uidで実行されます(wwwとかnobodyとかdaemonとか・・・httpdの設定によります)。 それに対してshellから実行する場合、現在のuidで実行されるのですからパーミッションが755の場合、ファイルオーナーでないと削除できません。 shellから該当ファイルをls -alFとかして、ファイルオーナーを確認してみてはいかがでしょうか?
お礼
本件、解決しました。 アドバイスくださり、本当にありがとうございました。 どうやってもラチあかないのでサーバーの管理者に 泣きをいれたところ、なにやら設定に問題があった ようです。
補足
おっしゃるように、実行ユーザーを確かめてみました。 ログインユーザーと間違いはありません。 ちなみに、Shell 上で、rm msg-*.txt とやると きっちり消えるようです。 どうもありがとうございました。もうちょっと がんばってみます。
お礼
本件、無事解決しました。 親身になってご回答くださり、本当にありがとうござい ました。 どうやってもラチあかないのでサーバーの管理者に 泣きをいれたところ、なにやら設定に問題があった ようです。 ユーザーが同時にアクセスできるファイル数を2倍に した、とかでちゃんと削除できることを確認しました。 ・・・こんな些細なことにとにかく何日も時間を 費やしてしまいましたが、これも経験になりました。 気持ちのこもったアドバイスに、感謝いたします。