ミスチルの大名曲の数々が配信決定!! 31日間無料!!【PR】

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使用)

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

A 回答 (7件)

>Admin権限


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

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

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

この回答への補足

ありがとうございます。

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

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

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

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

補足日時:2009/05/22 00:45
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2009/05/22 22:12

>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
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2009/05/22 00:16

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



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

この回答への補足

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

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

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

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

宜しくお願いします。

補足日時:2009/05/21 23:07
    • good
    • 0

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



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

ただしGuestアカウントにファイルのアクセスや実行の権限が必要でしょうが
    • good
    • 0
この回答へのお礼

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

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

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

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

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

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

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

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

お礼日時:2009/05/21 21:00

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



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

この回答への補足

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

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

よろしくお願いします。

補足日時:2009/05/19 23:15
    • good
    • 0

Winサーバーにはあまり詳しくないのですが、Cygwinのcronで一定期間のスクリプトの実行はできると思います。

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

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

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

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

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

お礼日時:2009/05/19 00:25

Windows版は触ったことがないので外していたらごめんなさいですが、Perlの中で(1時間ごとに実行なら) sleep(3600) なんてのはダメですかね。


timeでも良いですが、とにかく起動しっぱなしでsleepさせておく方法。
unixならこれでお休みしてくれますが…
    • good
    • 0
この回答へのお礼

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

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

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

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

お礼日時:2009/05/19 00:08

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

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

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

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

QタスクスケジューラでPerlが動作しなくなった

Windows2003上のタスクスケジューラで動かしていたPerlのスクリプトを2008に移行したところ、動かなくなり、原因が判らず困っています。

内容としては、mail_get.plというスクリプトで下記の処理をしています。
1.popサーバーからメールを受信
2.所定のフォルダに添付ファイルを出力
3.複号用バッチファイル(encode.bat)の起動
4.エンコードした結果をメールで送信し、サーバーへファイル転送

3.のバッチファイルを起動するところで、出力される添付ファイルが見つからない、という状態でエラーになります。
不思議なことに上記のスクリプトをタスクスケジューラでなく、手動で動かした場合は正常に動作します。デバッグ表示したところ、パスが通っていないという状況ではないようです。

3.を行う前に時間稼ぎのループを入れれば解決するのかもしれません。

perlはスクリプト言語なので、逐次動作するものと思っているのですが、OSの違いやCPU速度の関係で、先に子プロセスが呼び出されてしまう可能性があるのでしょうか?
同じような経験をされた方はおられないでしょうか?

Windows2003上のタスクスケジューラで動かしていたPerlのスクリプトを2008に移行したところ、動かなくなり、原因が判らず困っています。

内容としては、mail_get.plというスクリプトで下記の処理をしています。
1.popサーバーからメールを受信
2.所定のフォルダに添付ファイルを出力
3.複号用バッチファイル(encode.bat)の起動
4.エンコードした結果をメールで送信し、サーバーへファイル転送

3.のバッチファイルを起動するところで、出力される添付ファイルが見つからない、という状態でエラ...続きを読む

Aベストアンサー

タスクスケジューラーもwindows2008も使ってないので完全に勘ですが、
起動状況によってファイルが見つからないと言うのは、パスが通ってないのでは?

例えば普通は起動させた位置がカレントディレクトリになります。
例えばタスクスケジューラーから起動させた場合、の位置がカレントディレクトリになってたりとかはしないですか?
またタスクスケジューラーの仕組みは知らないのですが、どのように起動させてますか?

例えばの一つとして、起動の方法も数多くありますが、
AプログラムがBファイル(perl)の文字列を読み込み、
Aプログラムがその文字列をperlコンパイラに送りつける。
こんな手法が取られていればカレントディレクトリは間違いなくAプログラムの位置です。

ファイルの位置を見つけられないのはPerlですよね?
そして、起動方法によって見つかったり見つからなかったりするわけですよね?
ぱっと思いつく限りでは、明らかにカレントディレクトリが怪しいです。
カレントディレクトリは常に起動された環境に依存するからです。


>先に子プロセスが呼び出されてしまう可能性があるのでしょうか?
スクリプトどうこうは関係ないです。
これについてはどうperlを書いたかによります。
どんな条件下でも間違いなく、必ず処理を待つように書けている保証は必要です。
その確証が得られるように見直しをして下さい。

タスクスケジューラーもwindows2008も使ってないので完全に勘ですが、
起動状況によってファイルが見つからないと言うのは、パスが通ってないのでは?

例えば普通は起動させた位置がカレントディレクトリになります。
例えばタスクスケジューラーから起動させた場合、の位置がカレントディレクトリになってたりとかはしないですか?
またタスクスケジューラーの仕組みは知らないのですが、どのように起動させてますか?

例えばの一つとして、起動の方法も数多くありますが、
AプログラムがBファイル(perl)の文字...続きを読む

Qポートの80と443

こちらのサービス(https://secure.logmein.com/)を利用すると、インターネットを見られるサーバーのポートの80と443が空いていればルータやファイアウォールに特段の設定なく外部からサーバーを操作できるそうですが、逆にサーバーのポートの80や443を空けることには何か危険性があるのでしょうか。

Aベストアンサー

ポート80は一般的なHTTP、ポート443はHTTPSです。
この2つのポートがあいていなければインターネット接続(WEBブラウジング)は出来ません。
ですから、ほとんどのファイアウォールでこのポートは開いています。(インターネット接続を制限している社内LANでは当然閉じていますが)

ちなみに、よく使うポートとしてはFTPで20、21、SMTP(送信メール)で25、受信メールPOP3で110あたりです。セキュリティポリシー上、この辺は制限される事も多いですが、HTTP 80、HTTPS(暗号化用)443は通常閉じません。


危険性?
WEBプロトコルを使ってFTP的なファイル転送(WebDAV)やVPN等も出来るようになっています。当然そこにはある種の危険はつきものですが、WEBブラウジングに伴う危険と大きく変わりません。ウィルス等に感染していればこの2つのポートだけでも相当危険でしょうね。

参考まで。

Qインストールされているディレクトリを知るコマンドはありませんか?

phpのconfigerをするのに、
phpのインストールされているパスへ移動しなくてはいけませんが、
phpがどこにインストールされているかわかりません。

 rpm -qf php-4.0.6-7

とすると

 エラー: ファイル php-4.0.6-7: そのようなファイルやディレクトリはありません

と表示されてしまうのです。
rpmのサイトを見てオプションを設定して表示された結果から
ディレクトリを移動しても
コンフィギャーできるところに辿り着きませんでした。

どうしたらインストールされているディレクトリを
知ることができるでしょうか?

OSは以下の通りです。
AIX Version 4 もしくは LASER5 Linux release 7.2

今月が納期で生じたバグ対応のため大変困っています。
質問場所が違っていたら申し訳ないですが、
よろしくお願いいたします。

Aベストアンサー

Laser5に限っての話ですが、標準のインストールでphpはインストールされるはずですが。

# rpm -qa | grep -i php

でphpのパッケージ名は表示されませんか?

findを実行した結果、

php(コマンド)
libphp4.so(ライブラリ)
php.ini(設定ファイル)

等も見つからないのでしょうか?
もしそうならphpはパッケージもソースでもインストールされていない可能性があります。

Q複数ファイルの読み込みについて

perl初心者です。

あるディレクトリから拡張子がdataであるファイルを全て読み込みたいのですが、方法がわかりません。
cshで書くと
foreach arg (*.data)
コマンド $arg

のようになりますが、perlだと
foreach $arg (@arg){
コマンド $arg

となりますよね?
引数がリストなのでよくわかりません。
そもそもperlではできないのでしょうか?


それともう一点ですが、ファイルオープンするときに
foreachループの中で
open(FILE, "$arg");
とすることは可能ですか?
上の質問と組み合わせて全てのファイルを開いて作業を行いたいので。

説明が下手ですいません。補足しますのでよろしくお願いします。

Aベストアンサー

while(<*.data>)
{
## $_には、*.DATAなファイル名が格納されている。
open(F,"$_"); ##openする。
while(<F>)
{
##読み出された内容が$_に格納されている。
print $_; ##出力してみる。
}
}

というのが最短コーディングです。

Q○文字目に文字挿入

お世話になっています。
正規表現の文字置換s///gを使って数字の3桁目に-を挿入したいですが、どうしたらいいのかわかりません。

どなたか教えていただけないでしょうか。

5770001

577-0001

にしたいのでしが…

Aベストアンサー

試してないのですが
s/(.{3})(.*)/$1-$2/;
でよいはずです。

数字確定ならば\dでも可。

Qhtml上で、バッチやexeファイルの起動をしたい

わけあって、学校(養護学校)初心者向けにhtmlでメニューを作っています。
さて、スタートボタンやディスクトップにショートカットを使わず、htmlの中からバッチファイルやexeファイルを起動できるでしょうか?

もし可能ならば、教えてください。OSはWindows XPで起動したいファイルはexeファイルとバッチファイルです。
よろしくお願いします。

Aベストアンサー

<html><head></head>
<body>
<a href="file:///c:/windows/system32/calc.exe">電卓</a>
</body>
</html>

Qコンソール出力をテキストに出力する方法(コンソール出力は残しつつ)

【質問】
 Perl内部で実行される実行ファイル(.exe)のコンソール出力(STDOUT,STDERR)をテキストファイルに出力したい。(Perlのコンソール出力も含む。) ※コンソール出力は残しつつ。

(コマンドプロンプトの)パイプとリダイレクトを使用して上手くいくかと思ったのですが、標準出力と標準エラーとでは標準エラーが先に出力されてしまい、本来出力される順番で出力されない。(標準出力はバッファにたまるため??)

何かいい方法はありませんでしょうか?

【環境】
 Windows2000
 Active Perl 5.8.8

Aベストアンサー

CPANモジュールの File::TeeとかIO::Teeを使うというのはどうでしょうか?

File::Tee - replicate data sent to a Perl stream - search.cpan.org
http://search.cpan.org/~salva/File-Tee-0.03/lib/File/Tee.pm

use File::Tee qw(tee);

# simple usage:
tee(STDOUT, '>', 'stdout.txt');

print "hello world\n";

IO::Tee - Multiplex output to multiple output handles - search.cpan.org
http://search.cpan.org/~kenshan/IO-Tee-0.64/Tee.pm

use IO::Tee;
use IO::File;

my $tee = new IO::Tee(\*STDOUT,
new IO::File(">tt1.out"), ">tt2.out");

print join(' ', $tee->handles), "\n";

for (1..10) { print $tee $_, "\n" }
for (1..10) { $tee->print($_, "\n") }
$tee->flush;

CPANモジュールの File::TeeとかIO::Teeを使うというのはどうでしょうか?

File::Tee - replicate data sent to a Perl stream - search.cpan.org
http://search.cpan.org/~salva/File-Tee-0.03/lib/File/Tee.pm

use File::Tee qw(tee);

# simple usage:
tee(STDOUT, '>', 'stdout.txt');

print "hello world\n";

IO::Tee - Multiplex output to multiple output handles - search.cpan.org
http://search.cpan.org/~kenshan/IO-Tee-0.64/Tee.pm

use IO::Tee;
use IO::File;

...続きを読む

Qテキストボックスに数字しか入力できないようにするには?

タイトルの通りなのですが、あるテキストボックスに数字しか入力できないようにしたいのですが可能でしょうか?また、

「あいうえお 12345 「」:・、¥・」

というような文字列をコピーし、そのテキストボックスにペーストした際にも数字の12345だけが残るといった事も実現したいのですが…

どなたかご存知の方いらっしゃいましたら教えて頂けると幸いです。

Aベストアンサー

>英数字

では、こんな感じで

<input type="text" onKeyup="this.value=this.value.replace(/[^0-9a-z]+/i,'')">

Qperl 計算結果をファイルへ出力したい

perl やり始めたばかりです。宜しくお願いします。

入力ファイル data.txt があるとします。 data.txt は、

123 456
789 333
555 777

以上のようなテキストファイルといたします。このファイルを
以下の様に100分の1にして出力したい。

1.23 4.56
7.89 3.33
5.55 7.77

と言うことで、この場で教えていただきました。それが、以下です。

#!/usr/bin/perl

open(IN, "data.txt") or die ;
@x = <IN>;
close (IN);

foreach $line (@x){
chomp($line);
@elms = split(' ',$line);
foreach $data (@elms){
print $data/100," ";
}
print "\n";
}

おかげ様でこれはこれで上手く動きました。そこで、出力値をファイルに
書き込みたいのです。 もちろん、以下の様な方法でファイルに
書き込めるのは判っております。

計算プログラム.pl > outfile.txt

しかし、上のプログラムをベースにファイルに書き込めないかと色々と
試してはみましたが、どうも上手く行きません。
どなたか教えて頂けないでしょうか?
宜しくお願い申し上げます。

perl やり始めたばかりです。宜しくお願いします。

入力ファイル data.txt があるとします。 data.txt は、

123 456
789 333
555 777

以上のようなテキストファイルといたします。このファイルを
以下の様に100分の1にして出力したい。

1.23 4.56
7.89 3.33
5.55 7.77

と言うことで、この場で教えていただきました。それが、以下です。

#!/usr/bin/perl

open(IN, "data.txt") or die ;
@x = <IN>;
close (IN);

foreach $line (@x){
chomp($line);
@elms = split(' ',$lin...続きを読む

Aベストアンサー

>もちろん、以下の様な方法でファイルに書き込めるのは判っております。
 いや、全く分かってないから、書き出せないのですね。
#!/usr/bin/perl
open(IN, "data.txt") or die ;
open(OUT,">output.txt") or die;
foreach (<IN>){
my $line="";
my (@data,@out)= ();
chomp;
@data = split(' ',$_);
foreach(@data){
push(@out,$_/100);
}
$line = join (" ",@out);
print OUT "$line\n";
}
close (IN);
close (OUT);
__END__

QpythonスクリプトをWindowsのタスクスケジューラに登録したのですが上手くいきません

質問させてください。
Windows7を使っています。
タスクスケジューラによってpythonスクリプト(task.py)を定期的に実行させたいと思いますが上手くいきません。

このページ(http://www.atmarkit.co.jp/ait/articles/1305/31/news049.html)の基本タスクの作成ウィザードの部分を参考にプログラム/スクリプトに「参照」から"C:\Users\foo\Documents\task.py"と入れたのですが。


task.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
print("task test")


そもそも、task.pyをターミナルから起動する時に、
> python task.py
は勿論起動しますが、
> task.py
とすると、自分の場合秀丸エディタが開かれます。

どのようにすればいいのか教えて頂けないでしょうか?
宜しくお願い致します。

Aベストアンサー

そこに指定するのは、.EXEやBATやVBSのような「コマンドプロンプトからコマンド打ったら実行できる」ような「プログラム/スクリプト」です。
PythonとかPerlとかシェルスクリプトとかいった「スクリプト」の全てを受け付けるわけではありません。

そこにはPython.exeを(フルパスで)指定し、引数の方にtask.pyを(必要ならフルパスで)指定しましょう。




Windowsの場合、コマンドプロンプトからファイル名だけを入力することは、エクスプローラでダブルクリックするのと(ほぼ)一緒です。
エクスプローラでダブルクリックすると、拡張子と関連付けされた動作をします。
.XLSならExcelを起動
.DOCならMSWordを起動
というように。

.py は標準では関連付け無し。Pythonをインストールしたときとか、なんかのアプリで関連付けたら、その関連付けた動作をします。
あなたのPCでは、.pyは「秀丸で編集する」という動作と関連付けられているのでしょう。


人気Q&Aランキング