我有一个调用c shell脚本的perl脚本。
system($cmd)
$ cmd包含一些c-shell脚本,该脚本执行以下操作:
some_task1 &
set task1_id = $!
sleep 300s &
set task2_id = $!
while (`ps -p "$task1_id,$task2_id" | wc -l` > 2)
sleep 1m
end
# assume of the moment that task2 will finish first
kill -9 $task1_id
exit
我希望进程task1_id将终止,并且c-shell脚本将完成并将控制权一次返回给调用perl脚本
sleep 300s
完成。
但是,实际发生的是
之后exit
控件从不返回调用脚本。如何确保嵌套脚本真正返回?
谢谢。
答案 0 :(得分:0)
超时
一种返回到调用Perl脚本的方法是在超时调用中调用csh脚本。需要权衡的是,csh脚本在达到超时后将被中止。
#!/usr/bin/env perl
use warnings FATAL => 'all';
use strict;
use Sys::SigAction qw(timeout_call);
my $cmd = 'sleep 5';
my $timeout = 2;
if (timeout_call($timeout, sub {
my $out = system($cmd);
})) {
print "command '$cmd' runs into timeout after $timeout s\n";
}
线程
另一种方法是将每个任务封装在线程内的系统调用中。这是一个非常简单的示例,不考虑任何超时。分离的线程将在Perl脚本完成后继续存在,并将分配给PPID 1。
#!/usr/bin/env perl
use warnings FATAL => 'all';
use strict;
use threads;
my $task1 = threads->new(sub {
print "start task1\n"; qx(sleep 2); print "stop task1\n"; return
});
my $task2 = threads->new(sub {
print "task2\n"; qx(sleep 1); print "stop task2\n"; return
});
$task2->join();
$task1->detach();
print "Detach task1\n";