我有许多齿轮工客户发送一份工作,比如 job1。
$client = new GearmanClient();
$client->addServer();
$client->doBackground('job1', 'workload');
处理这项工作需要 10 秒钟。我想跟踪在任何给定时间有多少“job1”工作正在等待工人处理。我怎样才能做到这一点?
为了快速检查,我使用这个 bash one-liner:
(echo status ; sleep 0.1) | netcat 127.0.0.1 4730
这将打开与在 localhost 上运行的 gearman 实例的连接,并发送状态查询。这包含该实例上作业的名称和数量。然后可以使用//等处理信息以grep
进行报告awk
和wc
警报。
我也对显示所有已连接工作人员的工作人员查询执行相同操作。
(echo workers ; sleep 0.1) | netcat 127.0.0.1 4730
睡眠是为了保持连接打开足够长的时间来回复。
管理命令的完整列表以及输出的含义位于http://gearman.org/protocol/。只需搜索“管理协议”。
要扩展 d5ve 的答案,请添加 -w 参数以“超时”您的 netcat 连接,否则您将永远无法返回命令提示符。
$ (echo status ; sleep 0.1) | sudo netcat 127.0.0.1 4730 -w 1
telnet localhost 4730
status
worker_name total_queue currently_running number_of_workers
job1 1 1 9
我使用gearman_top
,它是mod-gearman的一部分。
网站的示例输出:
+-----------------------+--------+-------+-------+---------+
| Name | Worker | Avail | Queue | Running |
+-----------------------+--------+-------+-------+---------+
| check_results | 1 | 1 | 0 | 0 |
| host | 3 | 3 | 0 | 0 |
| service | 3 | 3 | 0 | 0 |
| eventhandler | 3 | 3 | 0 | 0 |
| servicegroup_jmx4perl | 3 | 3 | 0 | 0 |
| hostgroup_japan | 3 | 3 | 0 | 0 |
+-----------------------+--------+-------+-------+---------+
看起来没有任何直接的方法可以获取此信息。
这里有几个选项。首先,如果您可以在创建作业句柄时获取它们(搜索“说到检查状态”),您可以将它们存储在某个中心位置并从任何客户端查询它们。
其次,您可以将 Gearman 服务器设置为使用持久队列,然后自己对队列运行查询。这可能是两个选项中更容易和更清洁的。
Gearmand 有一个可以查询的telnet 接口。(协议的详细信息可以在 gearman 网站上找到 - http://gearman.org/?id=protocol)
我在这里使用此代码作为滚动我自己的代码的起点。 https://github.com/liorbk/php/blob/master/GearmanTelnet.php (此代码本身非常好,您应该可以直接使用它)
这是一个不太漂亮的解决方案,但除非有人改进了 gearman 管理界面,以便您可以直接通过 PHP 交谈或为其编写插件,否则您只能靠自己
在 Ubuntu 18.04 上,我gearadmin
默认安装了带有 gearman 包的二进制文件。
gearadmin --help
gearadmin --status
可以用来代替 netcat 替代方案:
gearadmin --status
queue1 334 10 10
还有一个衬里:
while :; do gearadmin --status; sleep 1; done