如何使用MySQL管理服务器端进程

时间:2014-05-09 20:26:27

标签: mysql perl process server-side

我有一个perl脚本,它接受唯一的参数(其中一个参数是 - user = username_here )。用户可以使用我正在开发的Web界面启动这些流程。

MySQL表,事务,跟踪运行perl脚本的用户

id  user    script_parameters           execute last_modified
23  alex    --user=alex --keywords=thisthat     0   2014-05-06 05:49:01
24  alex    --user=alex --keywords=thisthat     0   2014-05-06 05:49:01
25  alex    --user=alex --keywords=lg       0   2014-05-06 05:49:01
26  alex    --user=alex --keywords=lg       0   2014-04-30 04:31:39

如果进程应该运行,给定行的执行值将为“1”。如果应该结束该过程,则将其设置为“0”。

我的perl脚本不断检查此值以确保它不是“0”,如果是,则perl脚本终止。

但是,我需要管理这些过程以防止此问题:

  1. 如果我的服务器突然崩溃并重新启动,或脚本崩溃怎么办?我需要在后台运行一些东西,阅读 transactions 表并确保它使用适当的参数根据需要多次重启perl脚本。
  2. 所以,我无法弄清楚如何平衡控制用户管理他/她自己的交易,同时我也确保应该运行的交易,正在运行,以及那些那不是,不是。

    希望这是有道理的,我感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试从Web服务器启动长时间运行的进程,然后在数据库中跟踪这些进程。这不是不可能的,但不是推荐的做法。

主要问题是您的Web服务器当前正在处理HTTP请求,因为您实际上执行任何事情(包括在系统上运行的跟踪进程) - 您需要能够一直跑...

相反,一个更好的想法是让另一个守护的"经理"过程(正如你提到的perl,它是一个很好的语言来写它)spawn&跟踪长时间运行的任务(通过PID和信号),并为该进程更新SQL数据库。

然后你可以让你的经理"进程侦听从Web服务器启动新进程的请求。您可以使用各种IPC机制。 (例如:信号,SysV shm,unix域套接字,进程内队列,如ZeroMQ等)。

这有多重好处:

  • 如果您生成的脚本需要运行基于用户/组的隔离(来自系统或彼此),那么您的网络服务器不需要以root身份运行,也不需要setgid。
  • 如果产生的过程"崩溃",信号将被传递给"经理"过程,因此它可以毫无问题地跟踪错误执行。
  • 如果您使用进程内队列(例如:ZeroMQ)将请求传递给"经理"过程,它可以"油门"来自Web服务器的请求(以便用户无法有意或无意地导致D.O.S)。
  • 产生的过程是否结束,你不需要一个活跃的'对Web服务器的HTTP请求,以便更新跟踪数据库。

至于应该正在运行的东西是否正在运行,这真的取决于你的语义。 (即:它是基于已知的运行时间?基于消耗的数据?等)。

检查是否正在运行可以是双重的:

  1. "经理"进程根据需要更新数据库,包括生成的PID。
  2. 您的Web服务器托管代码实际上可以列出进程,以确定数据库中的PID是否实际正在运行,甚至还有多少时间它正在做一些有用的事情!
  3. 检查是否正在运行必须基于约定:

    1. 将生成的进程命名为可以预测的内容。
    2. 获取一个流程列表,以确定哪些内容仍在运行(已解散?),但这不应该是。
    3. 在任何一种情况下,您都可以通知请求生成进程的用户和/或实际执行某些操作。

      一种方法可能是让CRON作业从SQL数据库读取并执行ps以确定需要重新启动哪些生成的进程,然后重新请求" manager"进程使用Web服务器使用的相同IPC机制。如何区分跟踪/监控/日志记录中的开始与重新启动取决于您。

      如果服务器本身断电或崩溃,那么你可以拥有"经理"进程在第一次运行时执行清理,例如:

      1. 查找数据库中有关在服务器关闭之前运行的已生成进程的条目。
      2. 按PID和运行时间检查这些流程(这很重要)。
      3. 重新生成未完成的衍生过程,或者在数据库中存储某些内容以向Web服务器指示是这种情况。

      4. 更新#1

        根据您的评论,以下是一些入门指南:

        你提到了perl,所以假设你有一些熟练程度 - 这里有一些perl模块可以帮助你编写经理"流程脚本:

        如果你还不熟悉它CPAN是perl模块的存储库,基本上可以做任何事情。

        Daemon::Daemonize - 守护进程,以便在您注销后继续运行。还提供了编写脚本以启动/停止/重新启动守护程序的方法。

        Proc::Spawn - 帮助产生'儿童剧本。基本上fork()然后exec(),但也处理子进程的STDIN / STDOUT / STDERR(甚至tty)。您可以使用它来启动长期运行的perl脚本。

        如果你的web服务器前端代码还没有用perl编写,那么你需要一些非常便携的东西用于进程间消息传递和排队;我可能会使您的Web服务器前端易于部署(如PHP)。

        以下是两种可能性(许多更多):

        Proc::ProcessTable - 你可以对正在运行的进程使用此检查(并获得如上所述的各种统计数据)。

        Time::HiRes - 使用此程序包中的高粒度时间函数来实现您的限制'框架。基本上只是限制每单位时间排队的请求数。

        DBI(带mysql) - 从"经理"更新您的MySQL数据库处理。