gpt4 book ai didi

perl - 在 Perl 中启动非等待后台进程

转载 作者:行者123 更新时间:2023-12-01 08:09:51 25 4
gpt4 key购买 nike

我有一个 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 &|);

对于其中的每一个,父进程在退出之前继续等待子进程完成。请让我知道我做错了什么以及 fork 后台进程的正确方法。

预先感谢您的帮助!


帮助调试的完整代码。请注意,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;

关于perl - 在 Perl 中启动非等待后台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4431570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com