升级salt导致进程kill问题记录
重启salt-minion导致由salt启动的进程kill问题排查
作者:耀耀
环境
- 服务器系统为centos6及centos7
- 服务器服务进程都是由salt-master操作salt-minion启动
一、起因
- 服务器从salt-2015.5.11升级到2018.03.03版本
- 在升级的过程中导致在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
二、排查过程
我们在不同的服务器执行了salt.sh之后发现了在centos7上面的一些服务进程被kill了。之后我们排查是否因为这个脚本导致的问题,经过排查后发现bootstrap-salt.sh执行后是不会导致相关进程被kill
我们怀疑是不是
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引起的
以上我们认为有可能systemctl restart salt-minion引起的,接下来我们重复的执行这条命令,发现一个共同的问题就是只有被kill的进程是由salt-minion启动的时候才会挂掉。如果是由手动启动的进程不会因为执行这个命令而挂掉。
用starce可以看出进程的系统调用 执行strace -e signal=SIGTERM -p {pid} 之后重启salt-minion 发现进程是被systemd干掉的
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
所以这个挂掉的问题 应该是salt-minion和systemd之间的问题
研究了一下systemd的原理 发现systemctl在restart service的时候,有个killmode参数,默认是control-group,会向控制组内的所有进程发送sigterm。而salt的服务配置里就使用的默认参数,由salt-minion启动的进程都在salt这个组里,所以会导致相关进程被kill
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 会解决这个问题
相关文档
- https://www.jianshu.com/p/44b39aab32d4
- 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/
- https://github.com/saltstack/salt/issues/22993
升级salt导致进程kill问题记录的更多相关文章
- Linux下禁止使用swap及防止OOM机制导致进程被kill掉
首先解释两个概念: swap:在linux里面,当物理内存不够用了,而又有新的程序请求分配内存,那么linux就会选择将其他程序暂时不用的数据交换到物理磁盘上(swap out),等程序要用的时候再读 ...
- [转]Linux下防止进程使用swap及防止OOM机制导致进程被kill掉
首先解释两个概念:swap:在linux里面,当物理内存不够用了,而又有新的程序请求分配内存,那么linux就会选择将其他程序暂时不用的数据交换到物理磁盘上(swap out),等程序要用的时候再读进 ...
- 升级 Elasticsearch 集群数量实战记录
搜索引擎 升级 Elasticsearch 集群数量实战记录 现在线上有一个elasticsearch集群搜索服务有三台elasticsearch实例(es1.es2.es3),打算将其升级为5台(增 ...
- 升级到 ExtJS 5的过程记录
升级到 ExtJS 5的过程记录 最近为公司的一个项目创建了一个 ExtJS 5 的分支,顺便记录一下升级到 ExtJS 5 所遇到的问题以及填掉的坑.由于 Sencha Cmd 的 sencha ...
- linux 杀死进程kill 等用法
kill -9 $(ps -ef | grep process_name | grep -v grep | awk '{print $2}') 稍微解释一下: awk '{print $2} ...
- 升级Windows 10 正式版过程记录与经验
升级Windows 10 正式版过程记录与经验 [多图预警]共50张,约4.6MB 系统概要: 预装Windows 8.1中文版 64位 C盘Users 文件夹已经挪动到D盘,并在原处建立了符号链接. ...
- Linux服务器管理: 系统的进程管理终止进程kill命令
在Linux中如何用kill终止进程: kill -l [root@localhost~]#kill -l 可以看到kill中有很多的 常用: -1 是重启一个进程 -9 是强制杀死进程 ...
- 解决删除/升级Python导致Ubuuntu无法进入桌面的问题
找到问题的原因后于是换个思路,想大概修复了python,Ubuntu进入桌面应该也就没啥问题了.于是重新安装Python发现还是无济于事.也通过/usr/bin/python: can't find ...
- Linux系统网络编程中TCP通讯socket--send导致进程被关闭
https://blog.csdn.net/dsanmux/article/details/52083403 https://blog.csdn.net/u011425939/article/deta ...
随机推荐
- html手机网页自适应宽度
#在head之间加如下代码即可 <meta name="viewport" content="width=device-width, initial-scale=1 ...
- Metapackage包
Metapackage(功能包集)是把一些相近的功能模块. 软件包放到一起. ROS里常见的Metapacakge有: 2.Metapackage写法 CMakeLists.txt 写法如下: cma ...
- pytest 失败重跑截图
1.环境准备 /*@param: 作者:流浪的python Date:2019/01/19 env:python 3.7(由于3.0-3.5以下部分pytest可能有部分兼容问题安装建议2.7-2.9 ...
- 4D产品(DLG、DEM、DOM、DRG)介绍及区别
4D产品(DLG.DEM.DOM.DRG)是什么? 4D产品是指DRG(数字栅格地图).DLG(数字线化图) .DEM(数字高程模型).DOM(数字正射影像图).4D 复合产品是将4D产品中的任意两种 ...
- 50道Java线程面试题(转载)
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成 ...
- iview 或 element-ui table 列表表头加样式
table 表头有时候需要加一些小样式比如 必填项 这是我项目中遇到的需求=== 比例,产品, 部门为必填项,这个时候就需要在表头加个红色小星星. 首先在table中绑定:header-cell-c ...
- 运行第一个ruby程序
0x00 安装 首先需要安装一个ruby的环境,ruby分为win.linux.macOS版本.不用系统安装方法略有差异,不在这进行讲解. 0x01 运行第一个ruby程序 我这里是win环境,打开命 ...
- 使用promis串行化异步操作
该代码可在chrome下运行,对于低版本浏览器可以引入Q库 function async1() { var defer = Promise.defer() setTimeout(function(){ ...
- 20155220 吴思其 《网络攻防》 Exp1 PC平台逆向破解(5)M
20155220 <网络攻防> Exp1 PC平台逆向破解(5)M 实践内容 通过对实践对象--20155220pwn1的linux可执行文件的修改或输入,完成以下三块: 手工修改可执行文 ...
- 英语linux+英语firefox+英语Oracle OEM如何设置成显示日语
1 linux安装盘挂载,安装日语语言包 2 linux的系统语言设置为日语 3 firefox的 edit-> setting -> contents -> language se ...