こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Perlスクリプトを一定間隔で自動実行

Apache2.0.63+ActivePerl5.8.8.822を自宅サーバ(Windows XP Pro SP3)にて運営しています。
自宅サーバ内に、外部ウェブサイトのデータを取得するPerlスクリプトrecord.plを置き、
これを一定間隔で自動実行させたいと考えています。

そこで、record.plまたはそのショートカットをWindowsのタスクに登録してタイマー起動させてみました。
確かに一定間隔で自動実行されますが、実行の際に毎回必ずコマンド画面が立ち上がって来るので、これは嬉しくありません。

コマンド画面が立ち上がらない方法として、record.plをApacheのCGIとして実行することを考えました。
自宅サーバ自身からApacheに対してhttpリクエストを定期的に送る方法ということで、色々調べてみると、
以下のコマンドでtelnetを使ってhttpリクエストが送れるということまではわかりましたが、
--------------------------------------------------------
Microsoft Telnet> set local_echo(Enter)
Microsoft Telnet> set codeset Japanese EUC(Enter)
Microsoft Telnet> open 127.0.0.1 80(Enter)
GET /currency/record.pl HTTP/1.1(Enter)
HOST: 127.0.0.1 80(Enter)
(Enter)
--------------------------------------------------------
これをどうすれば自動実行できるのかがわかりません。

telnet以外にhttpリクエストを送る方法があるのなら、それでも構いませんし、
上記2つの方法以外でrecord.plを一定間隔で自動実行できるなら、それでも構いません。

コマンド画面が立ち上がらずに、自宅サーバのみでrecord.plを定期的に自動実行できる方法があれば教えてください。

よろしくお願いします。

<record.plのパス>
内部パス:D:/cgi-bin/currency/record.pl
URL(仮):http://xxx.ddo.jp/currency/record.pl (ScriptAlias使用)

投稿日時 - 2009-05-18 22:59:13

QNo.4970562

暇なときに回答ください

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

>Admin権限
の場合はデフォルトでfullコントロールになっていると思います

新規作成のAdmin権限のアカウントでログオンしてrecord.plが実行できるか確認して実行できれば↓を参照してみてください

http://pasofaq.jp/windows/admintools/0x80070005.htm

投稿日時 - 2009-05-22 00:00:04

補足

ありがとうございます。

Admin権限の新規アカウントでログオンし、ファイルの関連付けを変更してから、実行できるかどうか確認してみました。

record.pl自体は、ダブルクリックでも、ファイルを指定して実行からでも、コマンドラインからでも、実行できます。
しかし、登録したタスクに関しては、「ログオンしている場合に実行」にチェックが入っていると手動でもタイマーでも実行できますが、チェックを外してパスワード設定にすると、例によって設定エラーとなり、手動で実行しても“開始できません”となり実行されません。
もちろんパスワードは何回も確認しました。

試しにメインアカウントに戻って、メインアカウントで同じタスク内容を作成してみました。
「ログオンしている場合に実行」にチェックを入れると何も問題ありませんが、パスワード設定にすると上記と同じように設定エラーも出ますし、手動実行もできません。

つまり、どちらのAdmin権限アカウントに関しても、パスワード設定ではタスクは実行不能のようです。

投稿日時 - 2009-05-22 00:45:15

お礼

メインアカウントでもタスクが実行できないということより、問題は一気に解決しました。

新規作成のAdmin権限アカウントだけでなく、メインアカウントにもログオンのためのパスワードを設定していませんでした。
サーバ使用ということで、(再)起動の手間を省くためにパスワードは省略していました。
新規作成のAdmin権限アカウントにパスワードを設定したら、例のエラーは出なくなり、バックグラウンドでタスクが実行されるようになりました。

prumさん、何度もお付き合い頂き、ありがとうございました。
本来の目的は、これで完全に達成されました。
改めてお礼を申し上げます。

投稿日時 - 2009-05-22 22:12:14

ANo.6

>record.plまたはそのショートカット
record.plのショートカットではなくて
record.plの起動ショートカットをタスクに登録すればと思います
起動ショートカットの作成は
ショートカットの作成またはショートカットのプロパティで
perl D:/cgi-bin/currency/record.pl 

>拡張子の件に関して
record.pl を起動する「バッチファイル」record.cmdを
タスクに登録するのでもいいかと
record.pl 起動コマンドは
perl D:/cgi-bin/currency/record.pl

投稿日時 - 2009-05-21 23:05:14

お礼

拡張子に関してもアドバイス頂き、ありがとうございます。

起動ショートカットなるものがあることなど知りませんでした。
メインアカウントではpl拡張子はPerl Command Line Interpreterとして認識されていますが、それ以外のアカウントでは単なるテキストファイルとしてしか認識されていません。
ファイルの関連付けの問題であるような気がします。

とにかく、起動ショートカットやバッチファイルの作成方法は了解しました。
下のアクセス許可さえクリアできれば、起動ショートカットやバッチファイルは問題なく動作するものと思われます。

投稿日時 - 2009-05-22 00:16:26

ANo.5

>はじめにメインアカウントとGuestアカウントの両方にログオンしておかないといけないということですね

タスクの登録を管理者のアカウント(Admini権限)でパスワードありにすれば
バックグラウンドのアカウントはログオンしていなくても
タスクは実行されていますのでお試し下さい。

投稿日時 - 2009-05-21 22:21:18

補足

prumさん、ありがとうございます。

Admin権限のアカウントを新規作成し、タスク登録でパスワードを設定、最後に適用ボタンを押すと、“要求された操作を実行するアクセス許可がありません”と出てエラーとなってしまいました。
前回prumさんのおっしゃっていたアクセス権の設定が必要になるようです。

これはどこでどうやって設定すればいいのでしょう?

ちなみに、Perlのパスは以下の通りです。
C:/Perl/bin/perl.exe

宜しくお願いします。

投稿日時 - 2009-05-21 23:07:51

ANo.4

>そのアカウントの権限は、どのレベル(グループ)に設定すればいいのでしょう?

私の環境ではAdmin権限のログインで
Guestアカウントのタスクは完全にバッククラウンドで起動できています(コマンド画面は表示されません)

ただしGuestアカウントにファイルのアクセスや実行の権限が必要でしょうが

投稿日時 - 2009-05-20 00:48:40

お礼

権限に関する説明、ありがとうございます。
昨夜、ずっと試していたので返事が遅くなりました。

prumさんのおっしゃる通り、Guestアカウントでもタスクはバックグランド実行されることを確認しました。

ただ、これをするためには、はじめにメインアカウントとGuestアカウントの両方にログオンしておかないといけないということですね。
メインアカウントは当然としても、もう一つのアカウントにもログオンしっ放しというのはセキュリティ面で不安が残りますが・・・
とりあえずは実現できて良かったと思っています。

Guestアカウントに関しては、ファイルのアクセス権を何ら設定することなしに、record.plはタイマー実行されたことを付け加えておきます。
ただ、ファイル名がrecord.plだとメモ帳で開いて終わるだけで、肝心のスクリプトは実行されませんでした。実行されるにはファイル名をrecord.cgiと変更する必要がありました。

的確なアドバイスを頂き、ありがとうございました。

また、MOMON12345さん、Tinteさんにもお礼申し上げます。
今回はprumさんの方法が自分の理想に最も近かったので、こちらを採用させて頂きますが、お二方の方法も、何らかの場面で役に立つときが来ると思っています。

皆さんのアドバイスに感謝します。

問題は解決しましたが、Guestアカウントのログオンしっ放しと、拡張子の件に関して、何かアドバイスなり、注意点なり、コメントなりが頂けたらと思いますので、もう暫くはこの質問を締め切らずに置いておきたいと思います。もし何かありましたら宜しくお願いします。
そして土曜か日曜あたりに締め切りろうと思っています。

投稿日時 - 2009-05-21 21:00:45

ANo.3

>実行の際に毎回必ずコマンド画面が立ち上がって来る

タスクをログオンしているアカウントと別のアカウントで登録すれば、
コマンド画面が表示されることは無くなると思います。

投稿日時 - 2009-05-19 07:19:55

補足

アドバイスありがとうございます。

一つ質問です。
新たなアカウントを作成する場合。
そのアカウントの権限は、どのレベル(グループ)に設定すればいいのでしょう?
現在のログオンアカウントはAdmin権限です。

よろしくお願いします。

投稿日時 - 2009-05-19 23:15:53

ANo.2

Winサーバーにはあまり詳しくないのですが、Cygwinのcronで一定期間のスクリプトの実行はできると思います。PerlとCygwinはわりとメジャーなペアだと思いますよ。
具体的なインストールの方法や使い方はわからないのですが、たぶんCygwinで検索すると山ほど情報があると思います。
cronという実行シェル(だったような…)に実行させるスクリプトのパスと時間を書き込んで放っておくだけでよかったはずです。
具体的なことがわからなくてすんません。

投稿日時 - 2009-05-18 23:14:12

お礼

アドバイスありがとうございます。

以前telnetのことを調べていたときに、Cygwinに関するページも参照した記憶があります。
その時は、インストールと設定が物凄く面倒だなという印象があり、結局Cygwinという選択肢は見送ってしまいました。
今回、比較的簡単に実現できる方法が見つからなければ、Cygwinを導入することも考えてみます。

なにぶん急いでいるわけではないので、結果をご報告するまでに、ちょっと時間が掛かるかもしれませんが、その点はご了承ください。

とにかく、ご回答ありがとうございました。

投稿日時 - 2009-05-19 00:25:43

ANo.1

Windows版は触ったことがないので外していたらごめんなさいですが、Perlの中で(1時間ごとに実行なら) sleep(3600) なんてのはダメですかね。
timeでも良いですが、とにかく起動しっぱなしでsleepさせておく方法。
unixならこれでお休みしてくれますが…

投稿日時 - 2009-05-18 23:04:15

お礼

アドバイスありがとうございます。

record.plのスクリプト全体を、sleepを入れてループで回し続けるということですね。
ただ、Windowsではrecord.plの初回の起動のときにコマンド画面が立ち上がり、sleep中はコマンド画面が立ち上がりっぱなしになります。
途中でコマンド画面を閉じると、スクリプト自体も終了してしまうので、やはりコマンド画面という難点が残ってしまいます。
ループ実行中はコマンド画面を最小化しておくという手もあるのですが、なるべくコマンド画面が立ち上がらずにという方法を考えていますので、申し訳ないですが、これは参考意見とさせて頂きます。

負荷の点も心配だったのですが、これを実際に試してみると、スクリプトを起動しっぱなしでも、sleep中は負荷がまったく掛かっていないという発見がありました。
今後何らかの機会に使わせてもらいたいと思います。

ご回答、ありがとうございました。

投稿日時 - 2009-05-19 00:08:05

あなたにオススメの質問