【问题标题】:pkill doesn't kill processpkill 不会杀死进程
【发布时间】:2021-12-02 05:42:13
【问题描述】:

我有一个名为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 

我会定期重启服务以更新我们的加密证书

[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

【问题讨论】:

  • 如果你在 CentOS 8 上,你有 systemd。将其用于过程监督,不要尝试自己动手。一旦你用ExecStart=/usr/bin/java -jar productivity.jar -Dkeystore.location=./ssl/productivity.to.keystore .定义了productivity.service,你就可以免费获得systemctl restart productivity,更不用说所有其他命令(systemctl status productivity,或journalctl -u productivity来读取它的日志等)。
  • 请将ps aux | grep productivity 的输出添加到您的问题中。没有评论。
  • ps aux | grep productivity结果更新了我的问题
  • 我投票结束这个问题,因为关于操作系统、它们的实用程序、网络和硬件的问题在这里是题外话。 What topics can I ask about here?。请删除此内容并转至Unix & Linux Stack Exchange

标签: bash centos centos8


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    pgrep -io "PROCESSNAME" | xargs kill 
    

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

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

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

    只要我的 2cents。

    更新

    杀死进程的经验法则。

    1. SIGTERM 正在尝试以正常方式关闭进程。
    2. SIGTERM 不起作用时,您可以尝试 SIGINT。这是一个类似 CTRL-C 的中断。
    3. 如果这些信号都不起作用,您可以尝试 SIGHUB。该信号在关闭终端时发送给进程。守护进程将重新加载它们的配置文件。
    4. 最后但并非最不重要的是 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 pgrep -io "productivity" | xargs kill bash -c "exec -a productivity java -jar productivity.jar -Dkeystore.location=./ssl/productivity.to.keystore . & disown &"
    • pgrep -io "productivity" 找到 PID 了吗?
    • 否:/它执行但没有结果。我想我必须添加 @Charles Duffy 所描述的服务
    • 那你找错进程了!您是否尝试过pgerp 来搜索ps 提供的cmd? Charle 的示例是一个很好的解决方案,但它是一种完整的其他方法,无法解决您搜索错误进程 atm 的事实。
    • exec -a productivity 定义了进程的名称,ps aux | grep productivity确实向我展示了.. 0:21 productivity -jar ..,所以,如果我正确连接这些点,它应该可以工作。当我设置它时它曾经可以工作,但我无法弄清楚它为什么停止工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2016-01-24
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多