C Shell脚本未退出

时间:2018-07-03 15:47:08

标签: perl csh

我有一个调用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 

控件从不返回调用脚本。如何确保嵌套脚本真正返回?

谢谢。

1 个答案:

答案 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";