• 升级salt导致进程kill问题记录


    重启salt-minion导致由salt启动的进程kill问题排查

    作者:耀耀

    blog:https://www.liuyao.me

    环境

    1. 服务器系统为centos6及centos7
    2. 服务器服务进程都是由salt-master操作salt-minion启动

    一、起因

    1. 服务器从salt-2015.5.11升级到2018.03.03版本
    2. 在升级的过程中导致在centos7上的一些进程被kill了

    二、升级脚本(salt.sh)

    # cat salt.sh
    #!/bin/bash
    
    cd /root && wget -O /root/bootstrap-salt.sh https://bootstrap.saltstack.com && bash /root/bootstrap-salt.sh  > /tmp/bootstrap-salt.log
    
    Cenos6=`cat /etc/redhat-release|grep 6`
    
    if [ ! -n "$Cenos6" ];then
    
            systemctl restart salt-minion && echo `ps -ef |grep salt|grep '201'` |cut -d" " -f2|xargs kill -9 {} >/tmp/kill.log
    
    else
            /etc/init.d/salt-minion restart && echo `ps -ef |grep salt|grep 'python2.6'` |cut -d" " -f2|xargs kill -9 {} >/tmp/kill.log
    fi
    

    二、排查过程

    1. 我们在不同的服务器执行了salt.sh之后发现了在centos7上面的一些服务进程被kill了。之后我们排查是否因为这个脚本导致的问题,经过排查后发现bootstrap-salt.sh执行后是不会导致相关进程被kill

    2. 我们怀疑是不是

      systemctl restart salt-minion && echo `ps -ef |grep salt|grep '201'` |cut -d" " -f2|xargs kill -9 {} >/tmp/kill.log
      

      导致的问题,另外因为我们的进程在被kill -15的时候 会记录日志 我们从日志里发现进程确实是因为kill -15才挂掉的。那我可以认为并不是脚本里的kill -9引起的

    3. 以上我们认为有可能systemctl restart salt-minion引起的,接下来我们重复的执行这条命令,发现一个共同的问题就是只有被kill的进程是由salt-minion启动的时候才会挂掉。如果是由手动启动的进程不会因为执行这个命令而挂掉。

    4. 用starce可以看出进程的系统调用 执行strace -e signal=SIGTERM -p {pid} 之后重启salt-minion 发现进程是被systemd干掉的

      --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
      
    5. 所以这个挂掉的问题 应该是salt-minion和systemd之间的问题

    6. 研究了一下systemd的原理 发现systemctl在restart service的时候,有个killmode参数,默认是control-group,会向控制组内的所有进程发送sigterm。而salt的服务配置里就使用的默认参数,由salt-minion启动的进程都在salt这个组里,所以会导致相关进程被kill

    7. ps axwf -eo pid,user,cgroup 可以看一下是不是crgoup一样

    三、总结

    因为升级salt版本 minion重启的时候会导致由salt启动的进程挂掉的问题 原因是centos7版本进程有systemd来进行管理 远程的master发送命令给对应系统的minion minion作为父进程启动相关服务 相关服务会copy minion的cgroup作为自己的cgroup 当minion重启的时候 因为killmode参数,默认是control-group,所以systemd会找到和salt-minion一样的cgroup进行 并且让他们停止运行。所以说导致服务挂掉,解决的办法是修改/usr/lib/systemd/system/salt-minion.service 增加KillMode=process 会解决这个问题

    相关文档

    1. https://www.jianshu.com/p/44b39aab32d4
    2. https://xieyugui.wordpress.com/2017/09/13/%E9%87%8D%E5%90%AFsalt-minion%E4%BC%9A%E8%BF%9E%E5%90%8Ckill%E5%85%B6%E4%BB%96%E8%BF%9B%E7%A8%8B/
    3. https://github.com/saltstack/salt/issues/22993
  • 相关阅读:
    1058
    light oj 1067 费马小定理求逆元
    HDU 1022
    贪心
    HDU 4994 博弈。
    HDU 5234 背包。
    CodeForces 327B 水题。
    vue的$nextTick使用总结,this.$refs为undefined的解决办法,element Ui的树形控件setCheckedKeys方法无法使用
    Object.assign的用法
    react + antd 实现打印功能(踩了不少坑)
  • 原文地址:https://www.cnblogs.com/liu-yao/p/sheng-jisalt-dao-zhi-jin-chengkill-wen-ti-ji-lu.html
Copyright © 2020-2023  润新知