gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:14:17 26 4
gpt4 key购买 nike

我有一个perl脚本,它接受唯一的参数(其中一个参数是--user=username_)。用户可以使用我正在开发的web界面启动这些进程。
MySQL表transactions跟踪运行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

如果进程应该运行,则给定行的execute值将为“1”。如果进程应该结束,则设置为“0”。
我的perl脚本经常检查这个值,以确保它不是“0”,如果是,perl脚本将终止。
但是,我需要管理这些过程以防止出现此问题:
如果我的服务器突然崩溃并重新启动,或者脚本崩溃怎么办?我需要在后台运行一些东西,读取transactions表,并确保它使用适当的参数根据需要多次重新启动perl脚本。
因此,我很难找到如何平衡将控制权交给用户来管理他/她自己的事务,同时我也要确保应该运行的事务、正在运行的事务和那些不应该运行的事务都不会运行。
希望这是合理的,我感谢任何帮助!

最佳答案

似乎您正在尝试从web服务器启动长时间运行的进程,然后在数据库中跟踪这些进程。这不是不可能的,但不是推荐的做法。
主要问题是,一个HTTP请求需要在web服务器中处理,因为您实际上做了任何事情(包括跟踪系统上运行的进程)--您需要一些可以一直运行的东西。。。
相反,一个更好的主意是让另一个守护的“manager”进程(正如您提到的perl,这是一种编写它的好语言)生成并跟踪长时间运行的任务(通过PID和信号),并让该进程更新您的SQL数据库。
然后,您可以让“管理器”进程侦听从web服务器启动新进程的请求。您可以使用各种IPC机制。(例如:信号、SysV shm、unix域套接字、进程内队列(如ZeroMQ等)。
这有多种好处:
如果生成的脚本需要与基于用户/组的隔离(从系统或彼此)一起运行,则web服务器不需要以根用户身份运行,也不需要setgid。
如果生成的进程“崩溃”,则会向“管理器”进程发送一个信号,以便它可以无问题地跟踪错误执行。
如果使用进程内队列(例如:ZeroMQ)将请求传递到“manager”进程,则它可以“限制”来自web服务器的请求(这样用户就不会有意或无意地导致D.O.S)。
无论生成的进程是否顺利结束,都不需要向web服务器发出“活动”HTTP请求来更新跟踪数据库。
至于应该运行的东西是否正在运行,这实际上取决于您的语义。(即:是否基于已知的运行时间?基于消耗的数据?等等)。
检查它是否正在运行可以有两个方面:
“manager”进程会根据需要更新数据库,包括派生的PID。
您的web服务器托管代码实际上可以列出进程,以确定数据库中的PID是否正在实际运行,甚至确定它做了多少有用的事情!
检查它是否未运行必须基于以下约定:
将生成的进程命名为您可以预测的进程。
获取一个进程列表以确定哪些进程仍在运行(已失效?)那不应该。
在这两种情况下,您可以通知请求生成进程的用户和/或实际对此做些什么。
一种方法可能是有一个CRON作业,它从SQL数据库中读取数据,并确定需要重新启动哪些派生进程,然后使用web服务器使用的IPC机制重新请求“manager”进程这样做。如何在跟踪/监视/日志记录中区分启动和重新启动取决于您。
如果服务器本身断电或崩溃,则可以让“管理器”进程在首次运行时执行清理,例如:
在数据库中查找在服务器关闭之前一直在运行的派生进程的条目。
通过PID和运行时检查这些进程(这很重要)。
要么重新生成未完成的生成过程,要么将某些内容存储在数据库中,以向web服务器指示是这种情况。
更新#1
根据你的评论,这里有一些开始的提示:
您提到了perl,所以假设您在这方面有一定的熟练程度--下面是一些perl模块,可以帮助您编写“manager”过程脚本:
如果您还不熟悉它,那么CPAN是perl模块的存储库,它基本上可以做任何事情。
Daemon::Daemonize-对进程进行守护,以便在您注销后继续运行。还提供了编写脚本以启动/停止/重新启动守护程序的方法。
Proc::Spawn-帮助生成子脚本。基本上是ps然后fork(),但也处理子进程的STDIN/STDOUT/STDERR(甚至tty)。您可以使用它来启动长期运行的perl脚本。
如果您的web服务器前端代码还没有用perl编写,那么您将需要一些非常可移植的东西来进行进程间消息传递和队列;我可能会让您的web服务器前端易于部署(比如PHP)。
这里有两种可能性(还有更多):
PerlPHP实现。
Spread ToolkitPerl库的实现。
PHP-您可以对正在运行的进程使用此检查(并获取上面讨论的所有类型的统计信息)。
ZeroMQ-使用此包中的高粒度时间函数来实现“限制”框架。基本上就是限制每单位时间内取消排队的请求数。
Proc::ProcessTable(使用Time::HiRes)-从“管理器”进程更新MySQL数据库。

关于mysql - 如何使用MySQL管理服务器端进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23573393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com