爱猫家

SaltStack杀死进程saltutil.signal_job的问题

奇谭 2017-03-02 评论

每次执行salt都会生成一个job,通过唯一的job id可以获取到job的执行状态或者Kill掉job
但在使用过程中发现kill_job或term_job都无法kill掉子进程

环境
salt-minion version < 2016.11.1

查看源码,kill_job或term_job都是调用saltutil.signal_job函数

# vim /usr/lib/python2.6/site-packages/salt/modules/saltutil.py
...
def signal_job(jid, sig):
    '''
    Sends a signal to the named salt job's process

    CLI Example:

    .. code-block:: bash

        salt '*' saltutil.signal_job <job id> 15
    '''
    for data in running():
        if data['jid'] == jid:
            try:
-               os.kill(int(data['pid']), sig)
+               os.killpg(os.getpgid(int(data['pid'])),sig) 
                if 'child_pids' in data:
                    for pid in data['child_pids']:
                        os.kill(int(pid), sig)

如上所示,将os.kill(int(data['pid']), sig) 修改为 os.killpg(os.getpgid(int(data['pid'])),sig) 即可
但这个方法比较暴力

更好的办法就是升级到2016.11.1以上

def signal_job(jid, sig):
    '''
    Sends a signal to the named salt job's process
    CLI Example:
    .. code-block:: bash
        salt '*' saltutil.signal_job <job id> 15
    '''
    if HAS_PSUTIL is False:
        log.warning('saltutil.signal job called, but psutil is not installed. '
                    'Install psutil to ensure more reliable and accurate PID '
                    'management.')
    for data in running():
        if data['jid'] == jid:
            try:
                if HAS_PSUTIL:
                    for proc in salt.utils.psutil_compat.Process(pid=data['pid']).children(recursive=True):
                        proc.send_signal(sig)
                os.kill(int(data['pid']), sig)
                if HAS_PSUTIL is False and 'child_pids' in data:
                    for pid in data['child_pids']:
                        os.kill(int(pid), sig)

我们看这行 salt.utils.psutil_compat.Process(pid=data['pid']).children(recursive=True)
查看psutil_compat文件,看到引入了psutil,所以需要确保已经安装psutil模块,否则还是无法杀死子进程

发表评论

Hot Posts

Latest Comments

water 08月09日
 《基于saltstack开发的SOMSSH发布平台》 中的评论

版主https://github.com/qitan/SOMS 上边不是最新的吗?运行和你这显示的不一样哇。

打酱油的二师兄 05月08日
 《基于saltstack开发的SOMSSH发布平台》 中的评论

您好,想请教一下 配置salt-master 我这里把soms解压到了/data/wwwroot下 这个目录就是github中的SOMS项目?如果是的话,为什么没有/soms/saltconfig/*.conf的文件?

jja 09月25日
 《基于django的saltstack自动化运维平台SOMS》 中的评论

"上传的Html页面通过js限制了类型" 那个txt不是没有限制吗?所有的文件上传都提示上传失败

zander 07月21日
 《Django嵌套评论-icomments》 中的评论

这个好呀。学习一下,我是新手,才学django,收藏大神您了。

franjia 07月19日
 《基于django的saltstack自动化运维平台SOMS》 中的评论

你好,请问远程管理部分,目标主机是分组后的多个机器的话,执行命令后的返回信息如下: post tgt_select lcb-u-assets arg pwd check_type panel-group 源代码 tgt_select=lcb-u-assets&arg=pwd&check_type=panel-group 响应返回是{},空,是什么原因呢?