重启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

升级salt导致进程kill问题记录的更多相关文章

  1. Linux下禁止使用swap及防止OOM机制导致进程被kill掉

    首先解释两个概念: swap:在linux里面,当物理内存不够用了,而又有新的程序请求分配内存,那么linux就会选择将其他程序暂时不用的数据交换到物理磁盘上(swap out),等程序要用的时候再读 ...

  2. [转]Linux下防止进程使用swap及防止OOM机制导致进程被kill掉

    首先解释两个概念:swap:在linux里面,当物理内存不够用了,而又有新的程序请求分配内存,那么linux就会选择将其他程序暂时不用的数据交换到物理磁盘上(swap out),等程序要用的时候再读进 ...

  3. 升级 Elasticsearch 集群数量实战记录

    搜索引擎 升级 Elasticsearch 集群数量实战记录 现在线上有一个elasticsearch集群搜索服务有三台elasticsearch实例(es1.es2.es3),打算将其升级为5台(增 ...

  4. 升级到 ExtJS 5的过程记录

    升级到 ExtJS 5的过程记录   最近为公司的一个项目创建了一个 ExtJS 5 的分支,顺便记录一下升级到 ExtJS 5 所遇到的问题以及填掉的坑.由于 Sencha Cmd 的 sencha ...

  5. linux 杀死进程kill 等用法

    kill -9 $(ps -ef | grep process_name | grep -v grep | awk  '{print $2}')   稍微解释一下:  awk  '{print $2} ...

  6. 升级Windows 10 正式版过程记录与经验

    升级Windows 10 正式版过程记录与经验 [多图预警]共50张,约4.6MB 系统概要: 预装Windows 8.1中文版 64位 C盘Users 文件夹已经挪动到D盘,并在原处建立了符号链接. ...

  7. Linux服务器管理: 系统的进程管理终止进程kill命令

    在Linux中如何用kill终止进程: kill -l [root@localhost~]#kill -l   可以看到kill中有很多的 常用:  -1 是重启一个进程    -9 是强制杀死进程 ...

  8. 解决删除/升级Python导致Ubuuntu无法进入桌面的问题

    找到问题的原因后于是换个思路,想大概修复了python,Ubuntu进入桌面应该也就没啥问题了.于是重新安装Python发现还是无济于事.也通过/usr/bin/python: can't find ...

  9. Linux系统网络编程中TCP通讯socket--send导致进程被关闭

    https://blog.csdn.net/dsanmux/article/details/52083403 https://blog.csdn.net/u011425939/article/deta ...

随机推荐

  1. 《信息安全技术》实验二 Windows口令破解

    <信息安全技术>实验二 Windows口令破解 实验目的 了解Windows口令破解原理 对信息安全有直观感性认识 能够运用工具实现口令破解 实验环境 实验机Windows Server ...

  2. node-webkit,nwjs 打包启动启动很慢解决办法

    要开发一个桌面程序,可选择的有nwjs和electron,但是electron不支持xp,客户还是有一部分系统是用xp的,只能用nwjs. 由于程序需要安装很多npm的模块,node_module文件 ...

  3. Kafka设计解析(三)Kafka High Availability (下)

    转载自 技术世界,原文链接 Kafka设计解析(三)- Kafka High Availability (下) 摘要 本文在上篇文章基础上,更加深入讲解了Kafka的HA机制,主要阐述了HA相关各种场 ...

  4. 用kubeadm 搭建 高可用集群问题记录和复盘整个过程 - 通过journalctl -u kubelet.service命令来查看kubelet服务的日志

    1.根据  https://github.com/cookeem/kubeadm-ha/blob/master/README_CN.md  去搭建ha集群,遇到几个问题: runtime networ ...

  5. ASP.NET Core下载大文件的实现

    当我们的ASP.NET Core网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃.可以参考如下代码来避免这个问题. 关于此代码的几点说明: 将数据分成较小 ...

  6. 1.1《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——运行终端

    终端是个允许我们运行命令行的程序,运行命令前,先打开它.在MacOS系统上,可以使用macOS应用 Spotlight来打开终端窗口,Spotlight也有其他两种方式触发,一种是键入⌘␣(comma ...

  7. java 工作流项目源码 SSM 框架 Activiti-master springmvc 有手机端功能

    即时通讯:支持好友,群组,发图片.文件,消息声音提醒,离线消息,保留聊天记录 (即时聊天功能支持手机端,详情下面有截图) 工作流模块---------------------------------- ...

  8. 聊聊iOS Keychain

    某天,小熊碰见这样一个错误 Couldn't update the Keychain Item问题处理 ,网上搜索了下网上很多解决方案,依然百撕不得骑姐.后来参考下面两篇文章.才发现是用法不正确,网上 ...

  9. block本质探寻六之修改变量

    说明: <1>阅读本文章,请参照前面的block文章加以理解: <2>本文的变量指的是auto类型的局部变量(包括实例对象): <3>ARC和MRC两种模式均适用: ...

  10. WPF 主题

    原文:WPF 主题 WPF 切换主题 string packUri = String.Format(@"/WpfControlLibrary1;component/Dictionary1.x ...