首页 > 解决方案 > perl中超时的实现

问题描述

child_script.pl在下面的 perl 脚本中,如果脚本的执行超过 1 小时,我打算超时。但是,由于脚本在指定的时间限制后仍在运行,因此逻辑似乎不起作用。

任何猜测我在这里做错了什么?

我指的是在 perl 中实现超时的以下文档: https ://docstore.mik.ua/orelly/perl4/cook/ch16_22.htm

它适用于独立命令。该system命令可能有问题吗?

MY_CODE ( parent_script.pl)

#!/usr/bin/perl

my $sys_cmd = " perl child_script.pl 2>&1 | tee logfile.txt \n";

print "INFO: Enter alarm..\n";
eval {
    local $SIG{ALRM} = sub { die "alarm clock restart" };
    alarm 3600;                   # schedule alarm in 1 hours
    eval {
            print "INFO: Run script.. \n";
            system ($sys_cmd);
    };
    alarm 0;                    # cancel the alarm
};
alarm 0;                        # race condition protection
die if $@ && $@ !~ /alarm clock restart/; # reraise
print "INFO: Exit alarm..\n";

标签: shellperltimeoutsettimeout

解决方案


您不会使已启动的脚本超时;您为当前(父)脚本设置警报。您将不得不system从您的警报中杀死子进程(您已经开始使用的那个) - sub

编辑:

如果你有/usr/bin/timeout(如果你在 Linux 上运行就是这种情况),使用这个命令来处理超时可能会更方便,而不是在 Perl 中重新实现逻辑。


推荐阅读