【问题标题】:How can I start an external process in Perl?如何在 Perl 中启动外部进程?
【发布时间】:2014-11-03 20:26:33
【问题描述】:

我想启动一个进程,获取它的 PID,并将它写入一个 PID 文件。然后我想检查该文件,获取 PID,并检查进程是否使用kill 0 运行。

如果进程没有运行,我想启动它,获取它的 PID,并将它写入 PID 文件。如果进程已经在运行,那么我想忽略它。

如何启动一个进程以使其继续运行,并且我可以使用 Perl 检查它的状态?

【问题讨论】:

  • 看看fork。
  • 听起来很像 Proc::PID::File (metacpan.org/pod/Proc::PID::File)
  • init.d 通常会处理这个问题
  • 我可以提供更多细节吗?我使用您的信息尝试了一些事情,但我需要知道我可以开始哪些事情。我试过这些东西:
  • 我试过:perl -e 'use Proc::PID::File;' [未安装] [user@server init.d]$ syslog bash: syslog: command not found [user@server init.d]$ /etc/init.d/syslog Usage: /etc/init.d/syslog {start |stop|status|restart|condrestart} [m75926@m5deveet01 init.d]$ sshd bash: sshd: command not found [user@server init.d]$ /etc/init.d/sshd Usage: /etc/init. d/sshd {start|stop|restart|reload|condrestart|status} perl -e 'my $var1 = exec sar;print $var1;' [没有打印] 当我运行“top”时,我没有看到我启动的进程。请提前 thx 了解更多具体信息。

标签: perl process pid


【解决方案1】:

如果知道其他进程将需要它的 PID 作为与其交互的方式,则在 UNIX 上,一个进程管理自己的 PID 文件是传统的做法。

但是.. 如果你使用 fork/exec 启动进程,父进程会在 fork() 成功时收到子进程的 pid。

如果您提供更多细节,我们可以提供更精准的帮助。

---------- 2014-11-04 -----

您的 Web 服务“应该”创建自己的 PID 文件(许多商用服务器解决方案已经这样做了)。但是你没有说这些服务是如何启动的,也没有说它们是什么进程:apache、iis、node、websphere 等等。

一般来说,这感觉像是XY 问题。你告诉我们你想做X,但糟糕的是你正在做Y,而且有一个比X更好的方法去Y。

所以请告诉我们环境和软件。

【讨论】:

  • 使用仪表板显示某些 Web 服务是否正在运行/如果没有,则重新启动它们 - 所有这些都使用 pid 文件来确定每个服务是否正在运行。所以我有一个 .pl 文件,如果 -e pid 文件会对其进行 chks,如果是,那么进程是否正在运行?如果是这样->忽略。如果文件但不是进程,则重新启动进程,创建带有其编号的 pid 文件。如果文件存在但进程正在运行,则获取 pid 并写入新文件。如果文件 !exist && 进程未运行,则重新启动进程,获取 #,写入新文件。 >>所以我想通过创建一个我知道我可以检查是否正在运行的进程来测试,并获取它的#。如果这些信息不够,请说!
  • 我要做的是编写一个包装器withpidfile 来创建它的 own pidfile 并在其中记录它的 own pid,然后,当被杀死时,也会杀死它的孩子。
  • 谢谢,所有!我现在得到的是一个文件生成了它自己的pid。我需要研究如何创建另一个流程,而不是我自己的流程。还告诉我,如果我没有在这个网站上给予你帮助,请告诉我。不是很熟悉,并且离开时没有给予适当的感谢[通过投票,给予积分等/最好的事情,让我知道]。
猜你喜欢
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多