Java 无法停止甚至终止tomcat进程

Java 无法停止甚至终止tomcat进程,java,macos,tomcat,Java,Macos,Tomcat,我通过/catalina.sh start启动了一个tomcat服务,现在我想停止/杀死它-它不会这样做 当我用脚本开始时,我有两个过程: my-user 2728 2.2 0.8 4480236 138448 s001 S 9:52AM 0:01.82 "some -Djava configurations and executables" my-user 2737 0.0 0.0 2434840 800 s001 S+ 9:53AM 0

我通过
/catalina.sh start
启动了一个
tomcat
服务,现在我想停止/杀死它-它不会这样做

当我用脚本开始时,我有两个过程:

my-user   2728   2.2  0.8  4480236 138448 s001  S     9:52AM   0:01.82 "some -Djava configurations and executables"
my-user   2737   0.0  0.0  2434840    800 s001  S+    9:53AM   0:00.00 grep tomcat
当我运行
/catalina.sh stop
(或
/shutdown.sh
)时,它将只停止第一个进程。然后,对于另一个,我尝试使用pkill-9-f tomcat,但它没有起作用。这个过程基本上每秒都会改变它的PID,所以我也不能试图用PID来杀死它

再次尝试通过关闭脚本将其关闭会引发异常:

SEVERE: Catalina.stop:
java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:211)
    at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:450)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:400)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:487)
严重:Catalina.stop:
java.net.ConnectException:连接被拒绝
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
位于java.net.socksocketimpl.connect(socksocketimpl.java:392)
位于java.net.Socket.connect(Socket.java:589)
位于java.net.Socket.connect(Socket.java:538)
位于java.net.Socket。(Socket.java:434)
位于java.net.Socket。(Socket.java:211)
位于org.apache.catalina.startup.catalina.stopServer(catalina.java:450)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:400)
位于org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:487)

您可以尝试使用下面的命令

sudo kill-9$(ps aux | grep'[c]atalina''awk'{print$2}')


让我知道它是否有帮助

请尝试下面的命令,该命令将杀死所有导致grep的进程


ps-Af | grep“tomcat”| grep-v grep | awk{print$2}| xargs kill-9

我怀疑您得到了输出:

my-user   2728   2.2  0.8  4480236 138448 s001  S     9:52AM   0:01.82 "some -Djava configurations and executables"
my-user   2737   0.0  0.0  2434840    800 s001  S+    9:53AM   0:00.00 grep tomcat
。。。从命令
ps aux|grep tomcat

第一行是您的Tomcat进程。第二行是您刚刚开始的grep

这就解释了为什么PID“每秒都在变化”(它每次都在变化,因为它是一个新的
grep
),以及为什么在看到它的输出后不能杀死它

通过运行(例如)
ps aux | grep i_don_not_expect_find_this

避免这种情况的一个巧妙技巧是将grep模式的一个字符作为字符类:

$ ps aux | grep [t]omcat
因为这个正则表达式与“tomcat”匹配,但与“[t]omcat”不匹配,
ps | grep
将不再看到自己的grep


除此之外,根据您的描述,听起来好像
/catalina.sh stop
工作正常。它通过与Tomcat的管理端口建立套接字连接并请求关闭来工作。这解释了当进程已经停止时,为什么会出现连接被拒绝的异常。

您的tomcat是集群环境吗?我不确定。我怎么知道呢?这又有什么区别呢?对于
'[c]atalina'
来说,它给了我一个错误,错误地使用了
kill
,所以我把它改成了
'catalina'
,但它不起作用-我得到了
kill::没有这样的过程。当我尝试grep查找
'tomcat'
时也是如此。