如何检测分叉的xterm何时退出(perl RHEL6)?

问题描述 投票:1回答:1

在RHEL6上的perl中,我需要检测该xterm的用户何时退出分叉进程中运行的xterm。

这是一些演示问题的代码......

#!/usr/bin/env perl
use strict;

my $fork_stat = do_fork_sub();
print "fork_stat: ${fork_stat}\n";

exit;

sub do_fork_sub {

    my $pid = fork();

    if($pid == 0) {

        my $cmd = "xterm; tcsh &";
        system($cmd);

        # When system command above finishes, the xterm is done, exit
        # this child process...
        exit;
    }

    for(;;) {

        # If something happened in the xterm that 
        # created file "child_complete_flag", return "SUCCESS".
        if(-e "child_complete.flag") {return("SUCCESS");}

        # If the user of the xterm gave up on the work by exiting,
        # return "FAILED".  
        my $pid_srch_cmd = "ps uax | awk '{print \$2}' | grep ${pid}";
        print "-I- searching for pid using...  ${pid_srch_cmd}\n";
        my $fork_pid_alive = `${pid_srch_cmd}`;    

        if(!($fork_pid_alive)) {
        print "Detected end of xterm proc\n";
            return("FAILED");
        }

    sleep(3);
    }
}

这不起作用。如果我退出xterm,则forked进程仍然存在。在创建xterm的系统调用之后,我尝试将系统调用粘贴到$$的“kill -9”。没运气。

欢迎任何建议。


回答下面提到的一个问题....

“父母还需要做什么?另外,只要xterm中的工作需要,你就可以使用do_fork_sub块。这是有意的吗?整个程序的目的是什么?”

上面的例子是一个非常简化的版本,真正发生了什么。在那个世界中,xterm会运行-e并运行一个可能需要很长时间才能运行的工具。如果它成功完成,我希望父进程检测到这一点(从日志文件中解析此信息),从子程序返回下一步将开始(另外2-3天)。我不想做的是在这种情况下等待用户退出xterm。如果工具通过,则声明成功并继续。这样父母的目的就是坐着看着孩子。

在xterm中运行的工具也可能失败。在这种情况下,电子邮件将发送给用户a,他们最终会转到xterm并尝试调试问题。准备再试一次,他们再次启动工具并让它在xterm中运行(2-3天以上)。如果它通过......见上文。但是,它可能再次失败。如果他们最终放弃,他们将“退出”xterm。在这种情况下,我想检测这个并从子程序返回“FAILED”状态。

我正在玩$ SIG(CHLD)='IGNORE'和='DEFAULT',看看我是否可以控制分叉进程退出后的命运。而不是让它成为一个僵尸,我宁愿它死,所以父母可以检测到它的死亡并采取相应的行动。如果我把它放在fork()之前,设置$ SIG {CHLD} ='IGNORE'似乎很敏感。如果我退出xterm,子进程就会死掉,父进程会检测到它,一切都会相应地动作。但不幸的是,儿童过程似乎已经死亡了。看起来父母对“system(”xterm“)的调用”并不等待xterm完成,整个过程就会过早死亡。

perl fork
1个回答
-1
投票

好吧,它不优雅,但我想出的答案是将“echo ...”语句传递给xterm调用,该调用在“ps aux”的输出中唯一标识它。例如...

$ cmd =“xterm -e \”echo'此字符串是唯一的'; tcsh \“&” 然后系统($ cmd);

然后只需要输入“ps aux”输出的唯一字符串&&也许是“xterm”&&也许是用户......无论需要什么。

© www.soinside.com 2019 - 2024. All rights reserved.