Linux

如何殺死一個永不消亡的程序?

  • July 5, 2017

問題

我有一個不會因 SIGTERM 或 SIGKILL 而死的 java 程序。

logstash  2591     1 99 13:22 ?        00:01:46 /usr/bin/java -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC -Djava.awt.headless=true -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -Xmx1g -Xms256m -Xss2048k -Djffi.boot.library.path=/usr/share/logstash/vendor/jruby/lib/jni -Xbootclasspath/a:/usr/share/logstash/vendor/jruby/lib/jruby.jar -classpath : -Djruby.home=/usr/share/logstash/vendor/jruby -Djruby.lib=/usr/share/logstash/vendor/jruby/lib -Djruby.script=jruby -Djruby.shell=/bin/sh org.jruby.Main --1.9 /usr/share/logstash/lib/bootstrap/environment.rb logstash/runner.rb --path.settings /etc/logstash

每次收到信號時它都會重新生成。

Sep 15 13:22:17 test init: logstash main process (2546) killed by KILL signal
Sep 15 13:22:17 test init: logstash main process ended, respawning

聽起來很奇怪,但即使我重新啟動伺服器,它仍然沒有死

程序是通過 init 腳本使用以下命令執行的:

NAME=logstash
LS_USER=logstash
LS_OPTS="--path.settings=/etc/logstash"
LS_PIDFILE=/var/run/$NAME/$NAME.pid
LS_STDERR="/var/log/logstash/logstash.stderr"
DAEMON="/usr/share/logstash/bin/logstash"

runuser -s /bin/sh -c "exec $DAEMON ${LS_OPTS}" ${LS_USER} &>${LS_STDERR} &

除了重新安裝作業系統之外,還有什麼方法可以強制終止此程序?

環境

過程 :

logstash 5.0.0~alpha5

你 :

Red Hat Enterprise Linux Server release 6.7 (Santiago)

Java版本:

openjdk version "1.8.0_101"
OpenJDK Runtime Environment (build 1.8.0_101-b13)
OpenJDK 64-Bit Server VM (build 25.101-b13, mixed mode)

伺服器部署在 Microsoft Azure 上。

init:logstash 主程序(2546)被 KILL 信號殺死

實際上,您的過程確實到此為止。

init:logstash 主程序結束,重生

init 會啟動一個的logstash 程序來替換它。


這也顯示了哪個控制程序負責重新啟動 logstash: init。(在 RHEL 6 和 Upstart 的 CentOS 上)您的程序很可能是從(或類似)/etc/inittab中的任何一個或一個插入文件開始的,/etc/init/logstash.conf並且應該使用 apropiate 工具控制,initctl而不是使用kill.

嘗試initctl list查看logstash是否存在。

然後initctl stop logstash就會停止。

編輯或刪除 /etc/init 中的 conf 文件將允許您永久禁用它。

您甚至可以使用serviceandchkconfig命令來控製作業。

引用自:https://serverfault.com/questions/803175