【问题标题】:Start New Process after Exiting Perl Script退出 Perl 脚本后启动新进程
【发布时间】:2014-09-15 21:46:21
【问题描述】:

我对 Perl 还很陌生,所以请多多包涵。我想在 Perl 脚本退出时启动一个 c# 程序。这可能吗?如果我只是进行调用(比如对一些任意的其他 Perl 脚本),父进程将不会退出,直到子进程死亡。有什么办法可以在 Perl 中打破这种关系?我考虑过只写入文件,但这需要我始终在后台运行监控服务,这并不理想。

我尝试过 system() 但没有成功。这是我的代码中的一个 sn-p:

主脚本:

...
print "primary call starting\n";
system('reboot.pl');
$count++;
sleep(1);
print "primary call ending\n";
...

辅助脚本(reboot.pl):

...
print "reboot starting\n";
system('timeout 10');
my $iboot_urlcall = $ua->request($iboot_off);
system('timeout 10');
my $iboot_urlcall = $ua->request($iboot_on);
system('timeout 10');
print "reboot ending\n";
...

运行这个的标准输出结果是:

primary call starting
reboot starting

timeout

timeout

timeout
reboot ending
primary call ending
...

我想要的输出会更像....

primary call starting
reboot starting
primary call ending
timeout

timeout

timeout
reboot ending
...

这可能吗?

【问题讨论】:

  • 你是如何启动 Perl 脚本的?
  • 一个硬件正在对 cgi 脚本进行 url 调用。我通常也会按照这条路线启动附加脚本,但是我无法更改硬件上的固件(我可以,这只是一个限制)。
  • 在 Linux/Unix 系统上,您可以使用内置的 exec 将当前程序(在本例中为 perl 解释器)替换为给定的程序。 perldoc -f exec
  • 我相信当前程序仍然被阻止。我可能是错的..
  • 当 CGI 脚本退出时,我的硬件实际上只是在等待“HTTP/1.1 200 OK”消息。有什么好办法让我在退出前伪造这条消息吗?

标签: perl parallel-processing


【解决方案1】:

假设 Unix:

system ( 'your_command &' );

将立即返回,并让您的进程在后台运行。

【讨论】:

  • 对,这是我尝试过的一件事,但后来意识到硬件正在等待来自第一个 perl 脚本的 OK 响应。我可以让我的辅助脚本调用主脚本,这将允许主脚本在辅助脚本之前退出,但是我无法从硬件调用辅助脚本,这使得该方向没有意义。否则 system() 调用将是一个阻塞事件(辅助脚本基本上是一个命令,然后是 30 秒延迟,然后是另一个延迟的命令)。
  • 我没有关注你。我刚刚用一个非常基本的system ( 'sleep 136 &' ); 进行了测试 - 这立即存在,但“睡眠”过程按预期产生。如果您正在执行复合命令,则可能需要将其括起来。例如。 system('(sleep 32;echo sleep done) &');
  • 我在帖子中添加了更多内容,以便更清楚地阐述。可能是我使用的系统不正确。
  • 我更不清楚你现在想要完成什么——c# 是从哪里来的? timeout 10 是一个windows 调用,大概我们在这里说的是Windows perl?无论如何-您的“调用者”脚本可以:启动您的reboot.pl 并返回,或者在运行时跟踪reboot.pl。您正在尝试做一个折中的选择,而您实际上并没有合适的工具来做到这一点。我会提供替代方案 - 合并两个脚本,并使用线程运行“重启”部分。
猜你喜欢
  • 2020-02-03
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2011-09-16
  • 2015-10-31
  • 1970-01-01
相关资源
最近更新 更多