在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完成,整个过程就会过早死亡。
答案 0 :(得分:-1)
嗯,它并不优雅,但我想出的答案是传递一个回声......" xterm调用的语句,它在" ps aux"的输出中唯一标识它。例如......
$ cmd =" xterm -e \" echo'此字符串是唯一的&#39 ;; tcsh的\" &安培;"
然后系统($ cmd);
然后只需要输出" ps aux"对于独特的字符串&&也许" xterm" &安培;&安培;也许是用户......无论需要什么。