0

timeout_system モジュールをインストールしようとしています。私は窓にいます。やってみると

cpanm System::Timeout

それは失敗します。

やってみると

cpan システム::タイムアウト

私は得る

C:\Windows\System32>cpan System:Timeout
CPAN: LWP::UserAgent loaded ok (v6.03)
Fetching with LWP:
http://cpan.strawberryperl.com/authors/01mailrc.txt.gz
CPAN: YAML loaded ok (v0.77)
CPAN: CPAN::SQLite loaded ok (v0.202)
Fetching with LWP:
http://cpan.strawberryperl.com/modules/02packages.details.txt.gz
Fetching with LWP:
http://cpan.strawberryperl.com/modules/03modlist.data.gz
Database was generated on Mon, 16 Sep 2013 20:14:09 GMT
Updating database file ...
Done!Running install for module 'System::Timeout'
Running make for C/CH/CHENGANG/System-Timeout-0.07.tar.gz
Fetching with LWP:
http://cpan.strawberryperl.com/authors/id/C/CH/CHENGANG/System-Timeout-0.07.tar.gz
CPAN: Digest::SHA loaded ok (v5.63)
Fetching with LWP:
http://cpan.strawberryperl.com/authors/id/C/CH/CHENGANG/CHECKSUMS
CPAN: Compress::Zlib loaded ok (v2.042)
Checksum for C:\Dwimperl\cpan\sources\authors\id\C\CH\CHENGANG\System-Timeout- 0.07.tar.gz ok
CPAN: Archive::Tar loaded ok (v1.80)
CPAN: File::Temp loaded ok (v0.22)
CPAN: Parse::CPAN::Meta loaded ok (v1.4401)
CPAN: CPAN::Meta loaded ok (v2.120351)
CPAN: Module::CoreList loaded ok (v2.57)

  CPAN.pm: Building C/CH/CHENGANG/System-Timeout-0.07.tar.gz

Checking if your kit is complete...
Looks good
Writing Makefile for System::Timeout
Writing MYMETA.yml and MYMETA.json
cp lib/System/Timeout.pm blib\lib\System\Timeout.pm
C:\Dwimperl\perl\bin\perl.exe -MExtUtils::Command -e cp -- bin/timeout blib\script\timeout
pl2bat.bat blib\script\timeout
  CHENGANG/System-Timeout-0.07.tar.gz
  C:\Dwimperl\c\bin\dmake.EXE -- OK
Running make test
C:\Dwimperl\perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0,   'blib\lib', 'blib\arch')" t/*.t
t/00System-Timeout.t .. 1/9 'sleep' is not recognized as an internal or external  command,
operable program or batch file.
'sleep' is not recognized as an internal or external command,
operable program or batch file.
Can't find string terminator "'" anywhere before EOF at -e line 1.

#   Failed test 'system timeout exit code'
#   at t/00System-Timeout.t line 21.
Can't find string terminator "'" anywhere before EOF at -e line 1.

#   Failed test 'timeout timeout exit code'
#   at t/00System-Timeout.t line 27.
# Looks like you failed 2 tests of 9.
t/00System-Timeout.t .. Dubious, test returned 2 (wstat 512, 0x200)
Failed 2/9 subtests
t/01bin-timeout.t ..... '..' is not recognized as an internal or external command,
operable program or batch file.
t/01bin-timeout.t ..... 1/4 '..' is not recognized as an internal or external command,
operable program or batch file.

#   Failed test 'bin-timeout exit code'
#   at t/01bin-timeout.t line 15.
# Looks like you failed 1 test of 4.
t/01bin-timeout.t ..... Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/4 subtests

Test Summary Report
-------------------
t/00System-Timeout.t (Wstat: 512 Tests: 9 Failed: 2)
  Failed tests:  7, 9
  Non-zero exit status: 2
t/01bin-timeout.t   (Wstat: 256 Tests: 4 Failed: 1)
  Failed test:  4
  Non-zero exit status: 1
Files=2, Tests=13,  1 wallclock secs ( 0.09 usr +  0.05 sys =  0.14 CPU)
Result: FAIL
Failed 2/2 test programs. 3/13 subtests failed.
dmake.EXE:  Error code 129, while making 'test_dynamic'
   CHENGANG/System-Timeout-0.07.tar.gz
  C:\Dwimperl\c\bin\dmake.EXE test -- NOT OK
//hint// to see the cpan-testers results for installing this module, try:
  reports CHENGANG/System-Timeout-0.07.tar.gz
Running make install
  make test had returned bad status, won't install without force

C:\Windows\System32>ppm Par-Packer

誰かがアイデアを持っているなら、それは役に立ちます。Perl にモジュールをインストールした経験があまりないので、timeout_system を使用すると非常に便利です。

どうも

更新:私は次のようになりました:

                my $pid = fork(); 

                if (!$pid) {
                    exec($command);            
                } 

                else {
                    sleep 100;                           
                    system("TASKKILL /F /T /PID $$");
                }

動作します。

4

1 に答える 1

3

Windows での fork は *NIX システムの場合と同じように機能しないため、これが変更なしで Windows で機能するとは思いません。依存モジュール IPC::Cmd を CPAN 経由でインストールしてテストし、CPAN ドキュメントのサンプル スクリプトを実行すると、次の結果が得られます...

c:\Perl>perl TEST_IPC_Cmd.pl
Set up gcc environment - 3.4.5 (mingw-vista special r3)
fetched webpage successfully: Continuing in background, pid 5244.
Output will be written to `wget-log.2'.

this is what the command printed:
Continuing in background, pid 5796.
Output will be written to `wget-log.3'.
run_forked is not available:  at TEST_IPC_Cmd.pl line 30.
IPC::Open3 available: 1.12IPC::Run available: Can capture buffer: 1
c:\Perl>

System::Timeout は IPC::Cmd 実行メソッド (タイムアウト プロパティも設定する) の非常に単純なラッパーであるため、IPC::Cmd モジュールは、System::Timeout が実行される前に Windows で正しく実行されるように変更する必要があります。期待どおりに動作します。

私の場合、IPC::Cmd をインストールした後に System::Timeout を手動でインストールすると、実行可能ファイル (Perl ワンライナー) が正常に起動されましたが、3 秒後にプロセスを強制終了できませんでした。

#Perl_AAA.pl
use System::Timeout qw(timeout);
print localtime()."\n";
timeout('perl -e "sleep(9); print \"Done\n\";"'); # invoke CORE::system, will not timeout exit
print localtime()."\n";
timeout("3", 'perl -e "sleep(9); print \"Done\n\";"'); # timeout exit after 3 seconds
print localtime()."\n";
print "Normal exit\n";
exit;

結果...

c:\Perl>
c:\Perl>perl TEST_AAA.pl
Thu Oct 17 12:51:22 2013
Done
Thu Oct 17 12:51:31 2013
Running [perl -e "sleep(9); print \"Done\n\";"]...
Done
Thu Oct 17 12:51:40 2013
Normal exit

c:\Perl>
于 2013-10-17T16:47:16.993 に答える