PDA

View Full Version : CRON設定について


profit21
2004/07/11, 07:44 PM
度々お世話になります。
現在、CORNJOB設定をサーバーから行っているのですが(cron.cgiを指定して)以下のメールが送られてきます。
恐らく当方の設定ミスによりに動作してないと思われるのですが、どうすれば宜しいでしょうか?
ご指南の程をお願い致します。

/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: =: command not found
/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: require: command not found
/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: require: command not found
/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: require: command not found
/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: require: command not found
/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: =: command not found
/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: =: command not found
/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: =: command not found
/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: =: command not found
/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: =: command not found
/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: line 75: syntax error near unexpected token `&g'
/virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi: line 75: `&get_time;'

宜しくお願い致します。



コントロールパネルからの設定は、
「public_html/当サイトドメイン/cron.cgi」
を記入しております。

こがななほ
2004/07/11, 10:48 PM
CRONTABで呼び出されるスクリプトはシェルスクリプトである必要があったはずですが、如何でしょうか?
直接Perlスクリプトを呼び出していませんか?

もし直接Perlのスクリプトを呼び出していたなら、下のようにシェルスクリプトを作成して実行してみてください。


#!/bin/sh
/usr/local/bin/perl /virtual/yourID/cron_exe.pl

exit


これでも、その( Cron.cgi の)作り方によってはエラーが出ることもあります。

これでも解決しなければ、スクリプトの配布元を(自作の場合はスクリプトの全文を)提示してください。
(本来最初に提示すべきものですが)

profit21
2004/07/12, 10:56 AM
#!/bin/sh
/usr/local/bin/perl /virtual/yourID/cron_exe.pl

exit

ですが、上記の構文を記入したファイルをアップするということでしょうか?
「cron_exe.pl」
というファイルをつくるのでしょうか?

詳細を宜しくお願い致します。





#!/usr/bin/perl

$ROOT = "/virtual/当サイトアカウント/public_html/当サイトドメイン";

## jcode.plのパス
require "$ROOT/pl/jcode.pl";

## mail.cgiのパス
require "$ROOT/pl/mail.cgi";

## comu.cgiのパス
require "$ROOT/pl/comu.cgi";

## config.cgiのパス
require "$ROOT/pl/config.cgi";

## ユーザーデータディレクトリのパス
$USER_DIR = "$ROOT/log/userdata"; #(←最後に"/"は付けない)

## オークションデータディレクトリのパス
$DATA_DIR = "$ROOT/log/auctiondata"; #(←最後に"/"は付けない)

## ユーザーファイルのパス
$USER_FILE = "$ROOT/log/userdata/user.cgi";

## ロックディレクトリのパス
$LOCK_DIR = "$ROOT/lock"; #(←最後に"/"は付けない)

## メインログファイルのパス
$LOG_FILE = "$ROOT/log/search_log.cgi";
##------------------##
## 処理開始 ##
##------------------##

&get_time;

open(IN,"$LOG_FILE");
@Auction = <IN>;
close(IN);

foreach(@Auction){
&split_item;

&process;

##最低落札価格へ引き上げる
if($Dlow_kakaku){
if($nokoriD < $PRICE_UP_DAYS && ($nokoriH > 0 || $nokoriM > 0 || $nokoriS > 0) && $Dlow_kakaku > $now_price && $Dend ne "2" && !$soku_raku){
&hikiage;
}
}

##出品者へオークションの終了通知
if($nokoriD<=0 && $nokoriH<=0 && $nokoriM<=0 && $nokoriS<=0){

$item_file = "$USER_DIR/item/$Dshop\.cgi";

open(IN,"$item_file");
@item = <IN>;
close(IN);

foreach(@item){
($Dno1,$Dtitle1,$Durl1,$Dmark1,$Ddate1,$Dpass1,$Dsyoukai1,$Dkanricom1,$Dname1,$Demail1,$Dkt1,$Dtime1,$Dbana_url1,$Dpt1,$Dip1,$Dkey1,$Daddress11,$Daddress21,$Dteika1,$Dkakaku1,$Dtani1,$Dlow_kakaku1,$Done_kakaku1,$Denyear1,$Denmonth1,$Denday1,$Denhour1,$Denmin1,$Dsouki_end1,$Dencho1,$Dzyoutai1,$Dguide1,$Dbiko1,$Ds_html1,$Ds_hutan1,$Dp_hutan1,$Dpay11,$Dpay21,$Dpay31,$Dpay41,$Dpay51,$Dokuri_giki1,$Dphoto_file21,$Dphoto_file31,$Dend1,$Dkubun1,$Dshop1)=split(/<>/,$_);
if($Dno eq $Dno1){
last;
}
}

$end_mail_file = "$DATA_DIR/end_mail/$Dno1\.cgi";

open(IN,"$end_mail_file");
$checker = <IN>;
close(IN);

if(!$Dkanricom1 && $checker==0){
&end_info_mail;
}

##終了通知チェックへ
open(OUT,">$end_mail_file");
print OUT "1";
close(OUT);

}

}

exit;




##----------------------------------
## 引き上げ処理
##----------------------------------
sub hikiage {

$HisFile = "$DATA_DIR/history/$Dno\.cgi";
$AUBIDFile = "$DATA_DIR/auto_bid/$Dno\.cgi";

@HISTORY = ();
$auto_flg = 0;
$encho_flg = 0;

$hikiage_naiyou = "ダミー<>システム<>$Dlow_kakaku<>最低落札価格処理<>$DATE_NOW_TIME<><>\n";
push(@HISTORY,$hikiage_naiyou);

open(IN,"$AUBIDFile");
$AUBID = <IN>;
close(IN);

if($AUBID){
($AUno1,$AUid1,$AUbp1,$AUcom1,$AUtime1,$AUhatena1) = split(/<>/,$AUBID);

$pp = $Dlow_kakaku + $Dtani; # さらに自動入札の場合の基準値

if($Dlow_kakaku eq $AUbp1){
$hist2 = "$AUno1<>$AUid1<>$AUbp1<>$AUcom1<>$DATE_NOW_TIME<>$AUhatena1<>\n";
push(@HISTORY,$hist2);
$auto_flg = "1";
$auto_naiyou = "";
}
elsif($Dlow_kakaku < $AUbp1 && $AUbp1 >= $pp){
$hist2 = "$AUno1<>$AUid1<>$pp<>$AUcom1<>$DATE_NOW_TIME<>$AUhatena1<>\n";
push(@HISTORY,$hist2);
}
else{
$auto_flg = "1";
$auto_naiyou = "";
$Mail_flg = &bid_mail("$Sno");
$TO_mail = &to_mail("$Sno");
$NO = $Dno;
$TO_pn = $Sid;
$YOUR_kakaku = $AUbp1;
$NEW_kakaku = $Dlow_kakaku;
$OH = "1"; # 最落処理フラッグ
}
}
else{
if($now_kenri ne "-"){
$Mail_flg = &bid_mail("$Sno");
$TO_mail = &to_mail("$Sno");
$NO = $Dno;
$TO_pn = $Sid;
$YOUR_kakaku = $Sprice;
$NEW_kakaku = $Dlow_kakaku;
$OH = "1";
}
else{$OH = "1";}
}

&encho;

&a_lock("ON","$Dno");
open(OUT,">>$HisFile");
print OUT @HISTORY;
close(OUT);

if($auto_flg eq "1"){
open(OUT,">$AUBIDFile");
print OUT $auto_naiyou;
close(OUT);
}

if($encho_flg eq "1"){
open(OUT,">$Encho_file");
print OUT $cou;
close(OUT);
}

&a_lock("OFF","$Dno");

if($Mail_flg eq "1"){&mail_soushin;}
&mail_soushin2;

}

##------------------------------------------
## 高値更新メール送信判定
##------------------------------------------
sub bid_mail {

##1=送る
##0=送らない

$target = $_[0];
$ON = "1";
$OFF = "0";

$alert_file = "$USER_DIR/alert/$target\.cgi";

open(IN,"$alert_file");
$al = <IN>;
close(IN);

($hyouka,$bid,$bid_koushin,$bid_del,$auc_del,$ques,$ans) = split(/<>/,$al);

if($bid_koushin){return $ON;}
else{return $OFF;}

}

##----------------------------------
## 自動延長処理
##----------------------------------
sub encho {

$encho_flg = 0;

if($Dencho eq "1"){
if($nokoriD <= 0 && $nokoriH <= 0 && $nokoriM < $Autolong_act){
$Encho_file = "$DATA_DIR/auto_long/$Dno\.cgi";

open(IN,"$Encho_file");
$cou = <IN>;
close(IN);

if(!$cou){$cou = "0";}
$cou = $cou + 1;
$encho_flg = "1";
}
}

}




がcron.cgiの中身となります。

craft
2004/07/12, 04:36 PM
例えば以下の内容でcron.shというファイルをつくり、cron.shをCRONJOBとして設定してください

#!/bin/sh
/usr/local/bin/perl /virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi

exit

ということです。

profit21
2004/07/12, 10:17 PM
例えば以下の内容でcron.shというファイルをつくり、cron.shをCRONJOBとして設定してください

#!/bin/sh
/usr/local/bin/perl /virtual/当サイトアカウント/public_html/当サイトドメイン/cron.cgi

exit

ということです。

ありがとうざいます。
シェルスクリプト cron.sh ですがパーミッションという属性の変更 755など しなくてもいいのでしょうか?

宜しくお願いします。

こがななほ
2004/07/12, 11:22 PM
うちでは、700か705にしています。どちらでも動くようです。
試してみて問題があるならエラーメッセージが出ますのでそれを参考になさればよいと思います。

profit21
2004/07/12, 11:23 PM
Can't open perl script "/virtual/当サイトアカウント/public_html/www.当サイトドメイン/cron.cgi": No such file or directory
/virtual/当サイトアカウント/cron.sh: : command not found


というメールがきたのですが、どのようにすれば宜しいでしょうか?

こがななほ
2004/07/12, 11:33 PM
文字通り Can't Open ということでしょう。場所を今一度確認してみてください。

蛇足ですが、Webから実行しないperlスクリプトには pl を使うのが普通です。CGIと混同しますし。

profit21
2004/07/13, 12:01 AM
確認してみましたが場所は合ってました;

cron.ch がコマンドノットファンドとなっていますが、何故でしょうか?
ご指南頂いたとおりの内容にしたはずなのでうすが・・・。

お手数をおかけします。

profit21
2004/07/13, 12:04 AM
cron.sh
の間違えです。

profit21
2004/07/20, 11:32 PM
原因が全く不明です。
まず、
Can't open perl script "プログラムへのパスが入ってます": No such file or directory
となるのはなぜでしょうか?
試しに、自分のアカウント内の最上位ディレクトリ内に「cron.sh」というファイルを設置し、コンパネのCRONJOB設定のところで「cron.sh」と指定したにも関わらず、上記のエラーが出ます。
ファイルがないというエラーがでることがまずおかしいと思われます。
どなたかご指南頂けると幸いです。

webmaster
2004/07/20, 11:45 PM
シェルスクリプトのファイルの改行コードがUNIXの「LF」になっているか確認してください。

profit21
2004/07/22, 12:33 PM
お世話になります。

初歩的な質問なのですが、UNIXのLF改行は、具体的にどのように行えば宜しいのでしょうか?

宜しくお願いします。

こがななほ
2004/07/22, 02:00 PM
使っておられるソフトウェアの機能によります。

たとえばFFFTPだと、FTP転送の時に(アスキーモードで転送すれば)自動変換してくれます。
ヘルプなどを参照してみてください。

profit21
2004/07/22, 02:14 PM
お世話になります。

LF改行対応のエディタで編集後転送してみました。
以前のように、メール通知がこなくなったのですがこれは成功(正しく設定)したということでしょうか?

本来CRONが正常に動作しているとメール通知はこないのでしょうか?


宜しくお願い致します。

こがななほ
2004/07/22, 02:32 PM
実行結果はいかがでしょうか?予期した動作がなされていますか?テストしてみてください。
たしか、出力(STDOUT=標準出力)がない場合は送信されないんだと思います。

または、cron.shの、Perlスクリプトを呼び出すよりあとに(exit の直前に)、echo文をおいてみてください。
echo "Finished!!"
こう記述しておけば、Finished!! と書かれたメールが来る(ハズ)

profit21
2004/07/23, 05:21 PM
ありがとうございました。
Finished!! と書かれたメールが着ました。
正常に動作しているということですよね?

宜しくお願いします。

こがななほ
2004/07/23, 10:56 PM
その結果は、「Perlスクリプトの実行が終わった」ということを示してくれます。
Perlスクリプト内での実行内容は、そのスクリプトのエラーハンドリングによって異なります。
エラーによっては標準出力にサマリが出力され、結果としてメールに記載されることもありますが、まったくわからないこともありえます。

ですから、何度も申し上げているように、
「期待した動作」がCronによって実行されているなら問題ないはずです。それを判断するのはあなたです。
データの更新状況や生成内容によって判断されればよいかと思います。

私が回答できる内容は、これ以上でもこれ以下でもないと思っています。