1

我们有一个网络应用程序,它允许我们监视和控制我们的服务器应用程序。网页通过执行 shell 脚本来启动应用程序来启动它们。我们遇到的问题是,如果我们需要重新启动 apache,它会杀死任何由 Web 应用程序启动的进程。

网页是 PHP 的,并且正在使用该exec()命令来调用启动脚本。启动脚本启动 Java 应用程序,并使用以下内容运行应用程序:

nohup java ... &

如前所述,PHP 在 Linux 上的 Apache 中运行。是否有其他一些开关或方法来启动这些不会让它们成为 Apache 的子进程(并在它停止时被杀死)?

澄清

我对 Windows 比对 Linux 更熟悉。在 Windows 中,如果您想完成我们正在尝试的start操作,请在 shell 中添加关键字,即:

start <batchfile>

当你使用start时,新的 shell/进程可以从启动它的那个中解脱出来。是否有与该start命令等效的 Linux?

4

3 回答 3

0

我在我的博客上写了如何使用 php 创建长时间运行的进程,但是我必须同意 mvp 的观点,即这种方法对于您的目的来说远非理想 - 不仅仅是从特权分离的角度来看(使用 setuid 程序或sudo 很容易解决这个问题)。

根据您在此处尝试实现的目标,我怀疑 DJ Bernsteins daemontools中的附加功能将更适合。

于 2012-11-16T13:39:04.907 回答
0

通过 PHP 启动持久的进程听起来像是在自找麻烦。您将遇到与您类似的问题,并且会产生巨大的安全隐患。

更好的解决方案是让您的 PHP 页面将需要以批处理模式运行的内容保存到数据库表(MySQL 或 PostgreSQL)中。

另一个进程(可能在比 apache www 用户更高级的凭据下运行)应该作为守护进程运行,并不断检查数据库中的新内容并执行必要的任务(也可以每隔几分钟被 cron 触发)。

这样,您将用一块石头杀死两只鸟。

于 2012-11-16T09:25:14.457 回答
0

您可以使用batch(1)来启动持久的服务器进程。

在shell中,你可以做

batch << END
    java yourjava.jar
END

如果您有一些批处理 shell 脚本文件,请使用

batch -f yourbatchfile

如果您可以改进 Java 程序,您可以让它们在启动时调用daemon(3),也许使用Apache中的daemon 。

您可能希望将守护进程的进程 pid 存储在某处(例如,在某个文件或数据库中),以便能够停止它们(首先使用kill -TERM,然后使用kill -QUIT,最后使用kill -KILL)。

使用daemon函数或 Java 的东西可能比使用batch

于 2012-11-16T06:27:18.953 回答