我有一个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脚本终止。
但是,我需要管理这些过程以防止此问题:
所以,我无法弄清楚如何平衡控制用户管理他/她自己的交易,同时我也确保应该运行的交易,正在运行,以及那些那不是,不是。
希望这是有道理的,我感谢任何帮助!
答案 0 :(得分:1)
您似乎正在尝试从Web服务器启动长时间运行的进程,然后在数据库中跟踪这些进程。这不是不可能的,但不是推荐的做法。
主要问题是您的Web服务器当前正在处理HTTP请求,因为您实际上执行任何事情(包括在系统上运行的跟踪进程) - 您需要能够一直跑...
相反,一个更好的想法是让另一个守护的"经理"过程(正如你提到的perl,它是一个很好的语言来写它)spawn&跟踪长时间运行的任务(通过PID和信号),并为该进程更新SQL数据库。
然后你可以让你的经理"进程侦听从Web服务器启动新进程的请求。您可以使用各种IPC机制。 (例如:信号,SysV shm,unix域套接字,进程内队列,如ZeroMQ等)。
这有多重好处:
至于应该正在运行的东西是否正在运行,这真的取决于你的语义。 (即:它是基于已知的运行时间?基于消耗的数据?等)。
检查是否正在运行可以是双重的:
检查不是否正在运行必须基于约定:
在任何一种情况下,您都可以通知请求生成进程的用户和/或实际执行某些操作。
一种方法可能是让CRON作业从SQL数据库读取并执行ps
以确定需要重新启动哪些生成的进程,然后重新请求" manager"进程使用Web服务器使用的相同IPC机制。如何区分跟踪/监控/日志记录中的开始与重新启动取决于您。
如果服务器本身断电或崩溃,那么你可以拥有"经理"进程在第一次运行时执行清理,例如:
更新#1
根据您的评论,以下是一些入门指南:
你提到了perl,所以假设你有一些熟练程度 - 这里有一些perl模块可以帮助你编写经理"流程脚本:
如果你还不熟悉它CPAN是perl模块的存储库,基本上可以做任何事情。
Daemon::Daemonize - 守护进程,以便在您注销后继续运行。还提供了编写脚本以启动/停止/重新启动守护程序的方法。
Proc::Spawn - 帮助产生'儿童剧本。基本上fork()
然后exec()
,但也处理子进程的STDIN / STDOUT / STDERR(甚至tty)。您可以使用它来启动长期运行的perl脚本。
如果你的web服务器前端代码还没有用perl编写,那么你需要一些非常便携的东西用于进程间消息传递和排队;我可能会使您的Web服务器前端易于部署(如PHP)。
以下是两种可能性(许多更多):
Proc::ProcessTable - 你可以对正在运行的进程使用此检查(并获得如上所述的各种统计数据)。
Time::HiRes - 使用此程序包中的高粒度时间函数来实现您的限制'框架。基本上只是限制每单位时间排队的请求数。