我有多个gearman客户端发送作业,比如说job1。
$client = new GearmanClient();
$client->addServer();
$client->doBackground('job1', 'workload');
处理该作业大约需要10秒钟。我想追踪有多少'job1'作业正在等待工人处理它们。我该如何做?
为了快速检查,我使用这个 Bash 一行命令:
(echo status ; sleep 0.1) | netcat 127.0.0.1 4730
这会打开一个到本地运行的gearman实例的连接,并发送status查询。该查询包含该实例上作业的名称和数量。可以使用grep
/awk
/wc
等工具对信息进行处理,以进行报告和警报。
我还使用workers查询执行相同操作,该查询显示所有已连接的worker。
(echo workers ; sleep 0.1) | netcat 127.0.0.1 4730
使用sleep是为了保持连接足够长的时间以等待回复。
完整的管理命令列表和输出含义,请参见http://gearman.org/protocol/。只需搜索“Administrative 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 |
+-----------------------+--------+-------+-------+---------+
gearadmin
二进制文件。
gearadmin --help
gearadmin --status
代替netcat的替代方法:gearadmin --status
queue1 334 10 10
以下是一行命令:
while :; do gearadmin --status; sleep 1; done
Gearmand有一个telnet接口,您可以查询。(协议的确切细节可以在gearman网站上找到-http://gearman.org/?id=protocol)
我使用了这里的代码作为自己滚动的起点。 https://github.com/liorbk/php/blob/master/GearmanTelnet.php (这段代码本身非常好,您应该能够直接使用它)
这不是一个很好的解决方案,但在没有人改进gearman管理界面以便您可以直接通过PHP进行交流或编写插件之前,您只能靠自己。
看起来没有立即获取此信息的方法。
以下是几个选项。首先,如果您可以在创建作业句柄时抓取它们(搜索“谈到检查状态”),您可以将它们存储在某个中央位置并从任何客户端查询有关它们的信息。
其次,您可以设置Gearman服务器使用持久队列,然后自己对队列运行查询。这可能是两个选项中更容易和更清洁的选项。