我有一个 Perl 脚本,需要在后台启动另一个进程并退出,而不等待其他脚本完成。 StackOverflow 上有很多线程介绍如何在 Perl 中等待或如何不等待其他编程语言,但我似乎找不到 Perl 的正确答案。
我已经阅读了相当多的内容,并认为我正在做正确的事情,但我的尝试似乎都没有正常工作。以下是我迄今为止尝试过的所有变体,但均无济于事:
system(qq|perl /util/script.pl $id|);
system(qq|perl /util/script.pl $id &|);
exec(qq|perl /util/script.pl $id|);
exec(qq|perl /util/script.pl $id &|);
对于每一个进程,父进程都会继续等待子进程完成后再退出。请让我知道我做错了什么以及分叉后台进程的正确方法。
在此先感谢您的帮助!
帮助调试的完整代码。请注意,API->Function() 调用是面向对象的模块,我们的代码库用于数据库交互等的特定函数:
sub Add {
my $self = shift;
my $domain = shift;
if(!$self->IsValid($domain)) { return; }
my $SQL = qq| insert into domains set added=NOW(),domain=| . API->Database->Quote($domain);
my $sth = API->DatabaseQuery($SQL);
$SQL = qq| select last_insert_id() |;
$sth = API->DatabaseQuery($SQL);
my $id = $sth->fetchrow_array();
my $command = qq|perl /home/siteuser/util/new.pl $id &|;
system($command);
return {'id'=>$id,'domain'=>$domain};
}
第一个旨在以这种方式工作 -system
执行命令并完成以使其结束。
最后两个也是这样设计的——exec
专门设计为永不返回。它基本上用子进程替换了父进程。
然而,第二个应该可以解决问题:从system
调用的是 shell,它会给出要执行的字符串。由于字符串以“&”结尾,这意味着 shell 将以后台进程的形式启动您的命令,并在启动后完成自己的执行。
您能否发布更多代码来说明#2 如何不起作用?
另外,看看如果尝试反引号或 qx 会发生什么:
my $output = qx|perl /util/script.pl $id &|;
print $output;
另外,作为减少未知数的一种方法,您能否运行以下命令并告诉我打印的内容:
my $output = qx|(echo "AAAAAAA"; /bin/date; sleep 5; /bin/date; echo "BBBBBBB") &|;
print $output;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)