Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 需要在perl中创建孤立进程_Ruby_Perl_Fork_Orphan Process - Fatal编程技术网

Ruby 需要在perl中创建孤立进程

Ruby 需要在perl中创建孤立进程,ruby,perl,fork,orphan-process,Ruby,Perl,Fork,Orphan Process,嗨,我正在尝试通过分支子进程来执行代码 我有ruby代码a.rb,在其中我使用系统调用 系统(“perl abc.pl-subroutine='a'-command='b'-status='c'-logfile='d'-start\u datetime='e')) 现在在abc.pl中,我正在这样做 my $pid = fork; if (!$pid) { print "[INFO] in the child process \n "; print "[INFO] for

嗨,我正在尝试通过分支子进程来执行代码

我有ruby代码a.rb,在其中我使用系统调用

系统(“perl abc.pl-subroutine='a'-command='b'-status='c'-logfile='d'-start\u datetime='e'))

现在在abc.pl中,我正在这样做

my $pid = fork;
if (!$pid) {
    print "[INFO] in the child process \n ";    
    print "[INFO] forking worked, child process id: ($$) \n";
    while (1) { 
    if ( -d "$ENV{OUT_HOME}" ) {
        print "[INFO] $ENV{OUT_HOME} is available now to write $seq \n";
        open(my $FH,'>',"$ENV{OUT_HOME}/SEQ") or die "cannot open file to write $seq into $ENV{OUT_HOME}/SEQ";
        print $FH "$seq";
        close $FH; 
        print "[INFO] exiting from forked child process id: ($$)  \n";
        exit; # exit the while loop
    } 
    else {
        sleep (2);  
    }
  }
} else {
    print "[INFO] I am parent Process exiting from here \n";
    exit;
}

现在,我正在尝试获取不依赖于父进程的子进程(这里是abc.pl),当我运行脚本时,它执行运行perl脚本的系统命令,我在进程树中看到perl脚本。但我一直挂在那里。我不知道为什么系统命令在父项完成后不终止?如有任何建议或意见,我们将不胜感激

您需要为新独立的分叉进程创建一个新的POSIX会话

尝试以下操作(假设环境变量OUT\u HOME在调用perl之前已设置为文件夹):


您需要为新独立的分叉进程创建一个新的POSIX会话

尝试以下操作(假设环境变量OUT\u HOME在调用perl之前已设置为文件夹):

这一问题在以下文件中得到解决:

如何派生守护进程?

如果您所说的守护进程是指已分离(与其tty解除关联)的进程,那么以下进程将在大多数Unixish系统上运行。非Unix用户应检查其Your_OS::Process module以了解其他解决方案

打开/dev/tty并在其上使用TIOCNOTTY ioctl。详见tty(1)。或者更好的是,您可以只使用
POSIX::setsid()
函数,这样就不必担心进程组

将目录更改为/

重新打开STDIN、STDOUT和STDERR,使它们不连接到旧的tty

你的背景是这样的:

fork && exit;
该模块可从CPAN获得,它提供了一个为您执行这些操作的函数

正如常见问题解答所述,该模块可以为您简化此过程,尽管这只是可用于此任务的几个模块之一。

这在以下章节中介绍:

如何派生守护进程?

如果您所说的守护进程是指已分离(与其tty解除关联)的进程,那么以下进程将在大多数Unixish系统上运行。非Unix用户应检查其Your_OS::Process module以了解其他解决方案

打开/dev/tty并在其上使用TIOCNOTTY ioctl。详见tty(1)。或者更好的是,您可以只使用
POSIX::setsid()
函数,这样就不必担心进程组

将目录更改为/

重新打开STDIN、STDOUT和STDERR,使它们不连接到旧的tty

你的背景是这样的:

fork && exit;
该模块可从CPAN获得,它提供了一个为您执行这些操作的函数


正如常见问题解答所述,该模块可以为您简化此过程,尽管这只是可用于此任务的几个模块之一。

请提供ruby和perl的详细说明,并让我们了解您的期望和观察结果。例如,当我执行
ruby-e'system(*ARGV)时;将“bye rb:#{$$}”放在“perl-E”sleep 3中;说“再见,$$”
。。。它起作用了!我看到了子perl出口、父ruby出口,以及它的“孤立”孙子perl出口。不管你们有什么问题,我都并没有。Re“但我一直挂在那个里。我不确定为什么系统命令在父级完成后不终止?”,这不太可能。最佳猜测:孩子的STDIN、STDOUT或STDERR是一个管道,管道另一端的任何进程都在等待它被关闭。这是挂起的,而不是
system
。在后台监控时,您需要执行许多操作,包括:双叉、关闭所有句柄和创建新会话。请提供ruby和perl的详细说明,让我们知道您的期望和观察结果。例如,当我执行
ruby-e'system(*ARGV)时;将“bye rb:#{$$}”放在“perl-E”sleep 3中;说“再见,$$”
。。。它起作用了!我看到了子perl出口、父ruby出口,以及它的“孤立”孙子perl出口。不管你们有什么问题,我都并没有。Re“但我一直挂在那个里。我不确定为什么系统命令在父级完成后不终止?”,这不太可能。最佳猜测:孩子的STDIN、STDOUT或STDERR是一个管道,管道另一端的任何进程都在等待它被关闭。这是挂起的,而不是
system
。在后台监控时,您需要执行许多操作,包括:双叉、关闭所有句柄和创建新会话。可以用来做这件事。