Linux
如何殺死一個永不消亡的程序?
問題
我有一個不會因 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 文件將允許您永久禁用它。
您甚至可以使用
service
andchkconfig
命令來控製作業。