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も見ています

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

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

QD905i でmusic,jpにマイメニューに登録後の削除の仕方

はじめまして。
携帯に詳しくないのでよろしくお願いします。

今日ドコモのD905iでmusic,jpフルのmusic,jpトリ放題に315円で入会登録したんですが、さらにお金がかかるとしらなかったので、いらないので削除しようとしたら、マイメニュー画面にはmusic,jpトリ放題はあるんですが、いくら押しても画面がきりかわらず、仕方ないのでミュージックの画面最初からで行くと、入会してください、になっています。
退会削除をを押しても、入会してませんと出てきます。
入会してないならないでそれでいいんですが、マイメニューの画面でmusic,jpフルはどうやって削除出来るんでしょうか?

サイトに行っても登録してませんで、マイメニュー画面から消えてくれません。

詳しい方教えてください。

Aベストアンサー

マイメニューから今一度、確認して見て下さい。
無料、有料かかわらず会員登録されているサイトが表示されます。
もしmusic.jpがあれば会員登録されていますので
マイメニューからmusic.jpのサイトを選択するとサイトに飛びますので
下の方にマイメニュー削除があるのでそこから
入った料金コースを選んでiモードパスワードを入れれば削除出来ます。

music.jpのサイトを確認して見たんですが色々な料金コースメニューがあったので
削除出来ない場合は料金コースが違うのかもしれないのでマイメニューの登録内容の説明文を見て確認して削除してみて下さい。

どうしても分からない場合はドコモショップでも
一緒に消してくれるのでお気軽にご来店して下さい。

Qhttp://www.test.cgi/index などのCGI名のあとのパス名

http://www.test.cgi/index
のようになっているものを見かけるときがあります。普段は
http://www.test.cgi?mode=index
などしているのですが、どのような仕組みになっているのでしょうか?
これはPerlに限らず、CGIとして動作するものなら実装できるのでしょうか?
疑問に思ってしまったので、ご回答のほどをよろしくお願いします。

Aベストアンサー

PATH_INFOと呼ばれる情報です。Perl/CGIであれば環境変数の$ENV{'PATH_INFO'}で取得する事が出来ます。クエリー(?xxx)が$ENV{'QUERY_STRING'}で取得出来る事と同じ要領です。組み合わせてtest.cgi/path/info?query=stringのようにする事も出来ます。(それぞれ上記の環境変数で別々に取り出せます。)

他の言語に関しても取得出来ます。言語名とPATH_INFOで検索をかけてみてください。(例えば『php path_info』等)

Qyahoo.co.jpのアカウントを削除方法

yahoo.co.jpのアカウントを削除方法がわかりません。
よろしくお願いいたします。

Aベストアンサー

Yahoo! ヘルプ - Yahoo! JAPAN IDに関する
Yahoo! JAPAN IDを削除するには
http://help.yahoo.co.jp/help/jp/edit/edit-27.html

さらに不明点があればYAHOOホームページ内の右上に必ずヘルプがありますから、
ご参照下さい。

QCGIからsystem("display test.png");を呼び出すとエラーがでるのですが、なぜでしょうか。

CGIについて質問させていただきます。
初めてCGIでWEBアプリを作っているところです。ちなみにPerlも、初めて勉強しはじめました。私が作りたいものは、CGIから、GNUPLOTを使って画像を出力するものです。

error
display: unable to open X server `'., referer: http://....

コードは以下のようなものです。
#!/usr/bin/perl -w
use HTML::Template;
use strict;

gnuplot no syhori....

system "gnuplot /DS/tmp/gnuplot.plot";
system "cd/DS/tmp;ps2pdf /DS/tmp/gnuplot.ps";
system "convert /DS/tmp/gnuplot.pdf /DS/tmp/gnuplot.png";
system "display /DS/tmp/gnuplot.png";

コマンド(display /DS/tmp/gnuplot.png)や、Perl(CGIではなくPerlだけで試しにやってみました)を実行すると正常に画像が表示されるのですが、CGIの中に書くとエラーが出てしまいます。
どなたかよろしくお願いします。

CGIについて質問させていただきます。
初めてCGIでWEBアプリを作っているところです。ちなみにPerlも、初めて勉強しはじめました。私が作りたいものは、CGIから、GNUPLOTを使って画像を出力するものです。

error
display: unable to open X server `'., referer: http://....

コードは以下のようなものです。
#!/usr/bin/perl -w
use HTML::Template;
use strict;

gnuplot no syhori....

system "gnuplot /DS/tmp/gnuplot.plot";
system "cd/DS/tmp;ps2pdf /DS/tmp/gnuplot.ps";
system "con...続きを読む

Aベストアンサー

> ただ、なぜか画像へのパスを書いても、とどかないんですよ。。。。よく
> わかりません。

Web サーバが任意のディレクトリのファイルを外部に表示できるとセキュリ
ティ上問題があるので、それはそうです。とりあえず、画像ファイルを CGI
スクリプトと同じ場所にコピーして、表示できるか確認したらどうでしょ
う。

Qgoogle.co.jpで検索した言葉の履歴削除の方法

google.co.jpで検索したワードがパソコンに履歴として残っています。スペースキーを2回叩くとすべて検索したものが順に出てきます。どうやって消したらいいのでしょうか? ちなみにIEのツール、インターネットオプション、cookieの削除、ファイルの削除すべてしてみましたが、履歴は消えません。どなたかわかるから教えてください。windows XP利用しています。

Aベストアンサー

IEのツール→インターネットオプションのコンテンツタブ→オートコンプリートで「フォームのクリア」で、全部消えます。

検索窓に出た個々のものは、反転選択状態でDELキーです。

残さないようには、オートコンプリートの使用目的「フォーム」のチェックを外したら良いです。

Qtest.cgi?=3215とかってよく見ますが、あれってどうやって自動生成するんですか?

こんにちわ。掲示板とかのURLでxxx.cgi?=5621とかってありますが、あれってどういうふうな自動生成の仕方があるのですか?

Aベストアンサー

勘違いしてたらごめんなさい。

自動生成というか、
xxx.cgi?x=5621
も、普通のURLとして扱われてるんじゃないですかね。
上の「この質問に回答する」や「このQ&Aをともだちに紹介する」にカーソルあてて、
ステータスバー見てもらうと、分かりやすいと思いますけど。

つまり、今開いているxxx.cgiが、?x=5621というのをURLに付け足したわけでなく、
その手前のリンクで、すでに xxx.cgi?x=5621 として指定されているわけです。

5621の部分を自動生成する仕組みとなりますと、
それは、データの仕様により大きく違ってくるんで、
なんとも言えませんが、基本は連番ですよね。
最終の番号をどこからか参照して、1足してるだけです。

Q464.jpって削除されたんですか?

かなり前に464.jpを利用していて、最近はずーっと利用していませんでした。
友達から『464.jpってサイト知ってる?』と聞かれたので、久しぶりに何か読んでみようかなーと思い、午前中サイトを開いたのですが 『サーバーがみつかりません』と表示されました。
時間をずらして 今開いても見てもやはり『サーバーが見つかりません』となります。

464.jpはなくなってしまったのでしょうか?

Aベストアンサー

下記サイトによると「本日から1月31日までシステム移行作業中のため」だそうですが。

http://www.muramoto.net/

Qtest.cgiプログラムでファイルの取得

 題目のプログラムで、現在ディレクトリー内のファイルをすべて取得して、編集したいですが、どうすればよいでしょうか。

Aベストアンサー

opendirでファイル名を取得して編集すればいいと思います。

参考URL:http://www.7key.jp/program/perl/opendir.html

QIe9の検索語の履歴を完全に削除するには(2)

Ie9の検索語の履歴を完全に削除するには(2)
こちらで、検索語を表示しないでURLを表示する方法を教えていただきました。
http://oshiete.goo.ne.jp/qa/7284641.html

お教えいただいた方法はとても便利で今後はずっとこれにしようと思っているのですが、ご回答にあるhttp://www.google.co.jp/webhp?complete=0からhttp://www.google.co.jp/に戻ると検索語はまた表示されるようになります。「ツール→インターネットオプション→全般→閲覧の履歴→削除」で削除しても、検索語は削除されません。
http://www.google.co.jp/に戻っても検索語が表示されないようにするにはどうしたらいいでしょうか。つまり、検索語を記録から完全に削除してしまうにはどうしたらいいでしょうか。

Aベストアンサー

#2さんの補足に書かれていることですが

>Googleの検索ボックスに表示されるサジェストを、表示されないようにするのではなく、完全に消去つまり削除したいと思っています

Googleのサーバーにあるもので、しかも皆が同じものを利用しているのですから一個人が削除するということは無理でしょう。
#3でも書きましたが、検索履歴は個々のPC内に保存されているものですからそれぞれ削除することができます。
でもサジェストはGoogleのサーバー上にあるものですから削除はできません。
個人レベルでは表示するかしないかの選択になるわけです。

ちなみに、IEをオフライン作業にしてみればわかりますが、検索履歴は表示することができますが、サジェストはオフライン作業時にはサーバーにデータを取りにいけないので表示できなくなります。

Googleツールバーにはまだサジェストの選択肢が残っていますが、Web上の設定からはなくなってしまいました。
これは私も非常に「うざったく」思い、選択項目の復活を願っています。

Qunlink と rm どちらが良い?

unlink と rm どちらが良い?
レンタルサーバで、キャッシュファイルをするため、perl-cgiを毎日、実行させているのですが、
unlink[perl] とrm[unix shell] どちらが良いものでしょうか?
なるべく負荷のかからない方法を探しています。
どなたか、教えていただけないでしょうか?
宜しくお願い致します。

Aベストアンサー

 俺はいつも unlink 関数でやってます。
 rm を使うと背後でシェルを起動することになりますし、するとその分のメモリも起動時間も無駄になります。
 たとえロジック単体の性能として rm の方が優れていたとしても、unlink の方が効率がいいはずです。


人気Q&Aランキング

おすすめ情報