【问题标题】:Issue installing System::Timeout qw(timeout);问题安装 System::Timeout qw(timeout);
【发布时间】:2013-10-23 21:49:21
【问题描述】:

我正在尝试安装 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 $$");
                }

哪个有效。

【问题讨论】:

    标签: perl timeout


    【解决方案1】:

    鉴于在 Windows 上的分叉与在 *NIX 系统上的工作方式不同,我认为这不会在不改变的情况下在 Windows 上工作。通过 CPAN 安装和测试依赖模块 IPC::Cmd 并运行 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 运行方法的一个非常简单的包装器(它还设置了 timeout 属性),所以 IPC::Cmd 模块首先需要修改才能在 Windows 上正确运行,然后才能在 System::超时将按预期工作。

    就我而言,在安装 IPC::Cmd 后手动安装 System::Timeout 成功启动了一个可执行文件(Perl one liner),但在 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>
    

    【讨论】:

    • 在 windows 中是否有更简单的超时方法?
    • 这看起来不像这个模块曾经进入 CPAN,但是看看有人在这里开始开发的 Windows 特定超时模块...perlmonks.org/bare/?node_id=90316
    猜你喜欢
    • 2016-08-14
    • 2011-11-02
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多