【问题标题】:c shell script doesn't exitc shell脚本不退出
【发布时间】:2018-07-03 15:47:07
【问题描述】:

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

控制永远不会返回到调用脚本。如何确保嵌套脚本实际返回?

谢谢。

【问题讨论】:

  • 您的意思是在后台运行sleep 命令吗?这似乎违背了在后台运行其他任务然后将其杀死的目的。
  • 是的,我做到了。想法是有一个任务和一个超时计时器。当任务和计时器都在运行时,有一个 while 循环会“休眠”一小段时间。当 while 循环完成时,谁先完成,谁就杀死另一个,报告并退出。
  • 所以你的shell脚本看起来不像你在你的问题中提出的?
  • 我以为我提供了相关的细节。已编辑问题以反映您的评论。
  • 您能做的最好的事情是在您的 csh 代码中添加echo "before exit" .... echo "after exit" 类型的调试以查看实际情况。您可以使用#!/bin/csh -fbvx 打开调试/跟踪(我忘记了-fb 的作用,但我们也一直使用它,但请查看您的csh 手册页以确认)。祝你好运。

标签: perl csh


【解决方案1】:

超时

返回调用 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";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多