pkill 不会终止进程

pkill doesn't kill process

我有一个名为 运行ning 的进程 productivity

[root@productivity ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1009514/sshd        
tcp6       0      0 :::8443                 :::*                    LISTEN      2803472/productivit 
tcp6       0      0 :::443                  :::*                    LISTEN      1017657/httpd       
tcp6       0      0 :::80                   :::*                    LISTEN      1017657/httpd       
tcp6       0      0 :::22                   :::*                    LISTEN      1009514/sshd        
udp        0      0 127.0.0.1:323           0.0.0.0:*                           1009281/chronyd     
udp6       0      0 ::1:323                 :::*                                1009281/chronyd 

我定期重启服务来更新 let's encrypt 证书

[root@productivity ~]# cat restart-productivity.sh 
#!/bin/sh
pkill "productivity"
bash -c "exec -a productivity java -jar productivity.jar -Dkeystore.location=./ssl/productivity.to.keystore . & disown &"

几个月来这就像一个魅力。现在,即使我手动 运行 pkill productivity 服务也不会被杀死。我只能通过调用 kill PID 来终止服务。这确实有效,但对自动化没用。

我 运行正在使用 CentOS 8,我不知道为什么它停止工作。有人可以帮我吗?

更新

[root@productivity ecommerce]# ps aux | grep productivity
root     2803472  1.3 10.3 2648228 204168 pts/1  Sl   20:24   0:21 productivity -jar productivity.jar -Dkeystore.location=./ssl/productivity.to.keystore .
root     2803848  0.0  0.0  11800  1152 pts/1    S+   20:49   0:00 grep --color=auto productivity

我使用 kill 向大多数进程发送 SIGTERM。 我不再使用 pkill,而是更喜欢 pgrep 结合 kill ...

pgrep -io "PROCESSNAME" | xargs kill 

-i是检查不区分大小写 而-o是只输出第一个进程ID。

您可以在 ~/.bashrc_aliases 中将其用作 alias 或直接在 ~/.bashrc 中使用。 例如,我用它来杀死 discord,因为它不会自行停止。

alias kill_discord='pgrep -io discord | xargs kill'

只是我的 2cents。

更新

终止进程的经验法则。

  1. SIGTERM 正在尝试以正常方式关闭进程。
  2. SIGTERM 不起作用时,您可以尝试 SIGINT。这是一个像 CTRL-C.
  3. 这样的中断
  4. 如果这些信号都不起作用,您可以尝试 SIGHUB。该信号在关闭终端时发送到进程。守护进程将重新加载它们的配置文件。
  5. 最后但同样重要的是 SIGKILL。无论如何这都会终止任何进程,并且只应在进程不再响应时使用它。
kill {-2|-INT|-SIGINT|-s 2|-s INT|-s SIGINT|--signal 2|--signal INT|--signal SIGINT} [PID]
kill {-1|-HUB|-SIGHUB|-s 1|-s HUB|-s SIGHUB|--signal 1|--signal HUB|--signal SIGHUB} [PID]
kill {-9|-KILL|-SIGKILL|-s 9|-s KILL|-s SIGKILL|--signal 9|--signal KILL|--singal SIGKILL} [PID]

最终对我有用的解决方案是

#!/bin/sh
PID=`pidof productivity`
kill $PID
bash -c "exec -a productivity java -jar productivity.jar . & disown &"