我用 PHP 编写了一个软件模块,用于管理不同数据存储(MySQL、ElasticSearch 和 Redis)中的数据保存。为了测试该模块,我在 Apache JMeter 中创建了几个测试计划,其中一些计划会发出大量并发请求。这些测试针对 Ubuntu 14.04 LTS VM(Vagrant 盒)中的 LAMP 堆栈运行。
我观察到,有时端口 9200 (ElasticSearch) 在一定数量的请求后会关闭。这很好,因为我想测试其中一个数据存储不可用的情况。但是,为了验证测试结果,我需要再次打开该端口。
ElasticSearch 仍在运行并监听端口。
试运行前情况
$ nmap -p 9200 localhost
(...)
PORT STATE SERVICE
9200/tcp open wap-wsp
$ sudo netstat -tlnp | grep '9200'
tcp6 0 0 :::9200 :::* LISTEN 1057/java
试运行后情况
$ nmap -p 9200 localhost
(...)
PORT STATE SERVICE
9200/tcp closed wap-wsp
$ sudo netstat -tlnp | grep '9200'
tcp6 0 0 :::9200 :::* LISTEN 1057/java
问题
到目前为止,我已经等到商店再次开门或重新启动虚拟机。然而,这非常不方便,这引出了我真正的问题:
有没有命令可以重新打开已关闭的端口?
我搜索过,但只找到有关如何配置的建议iptables
。我试过
$ sudo iptables -A INPUT -d 0/0 -s 0/0 -p tcp --dport 9200 -j ACCEPT
但据我所知,这只会创建一条规则,并不会对端口产生任何直接影响:
$ sudo iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9200
$ nmap -p 9200 localhost
(...)
PORT STATE SERVICE
9200/tcp closed wap-wsp
答案1
我认为这个监听端口 9200 的 java 应用程序刚刚崩溃,您需要重新启动它。
从中netstat -nlpt | grep 9200
,您可以获取进程 ID(就在末尾的 /java 旁边)。
然后使用该 id 运行:ps aux | grep [process id]
找出什么是 java 应用程序(如果您还没有),然后重新启动它,这应该可以解决您的问题!