近期接到领导通知,要将公司内的所有Windows服务添加到自动发布系统中,由于这种服务很多,节点分布散乱,每次都是由开发主管手动替换(虽然他们自己开发了自动打包替换工具,但仍需要一台一台登陆到服务器上去执行)。

  工作需求:让所有服务(黑窗口的.exe)在前台cmd显式运行,不能纳入系统服务(不能以服务的形式启动)。

  其实一开始我是懵逼的,虽然很顺利的完成了拉取程序代码,编译程序,替换文件,停止进程,但在启动黑窗口时,遇到了问题:

 就是通过jenkins的pipeline脚本去调用salt-master分发命令时,后台服务已经顺利跑起来,但是jenkins后台日志却卡在这里,导致jenkins的这个job不能正常释放,这样的话,自动化发布是算失败的。

 然后我就开始各种查资料,各种测试,捣鼓了好几天,终于解决了这个问题。

  解决这个问题的过程和思路:

  ①一开始我以为是start命令的问题,然后开始查找各种start命令的参数,全部试了,还是没解决。

  ②后来请教其他大牛,得到了一个思路,是salt这边没有返回执行结果,导致jenkins这边释放不了;紧接着我打开了salt-minion的debug模式,看了一段时间日志,发现日志的结果是无限执行一段代码:

  得出的结论是:我发布的这个程序是不是有问题(无限执行,不退出?),然后问了开发,但是开发好像没鸟我;后来我又想,应该不是这个问题,发布其他程序的时候也是调用各种start,应该不是这个问题。那么为啥后台一直重复刷这些日志呢,肯定是在执行某些任务,然后我自己测试了一下,执行:

  1. salt '*' cmd.run "start cmd"

  发现后台日志也是一直在刷,后来我渐渐明白,因为cmd这个窗口不退出的话,salt会一直去执行这个任务,不会退出,除非关掉这个cmd窗口。

  ③那么到底该怎么解决这个问题?我想到了用bat脚本,python脚本,在脚本中写命令去调用这个启动命令,然后试了bat脚本,还是不行,python的os模块调用的也是start命令,我感觉应该也不行,也没有试,还要安装python;所以我直接选择了powershell,不得不说,还是很牛逼的这个powershell.找到了powershell的官方文档,简单学习了一下,就把这个问题搞定了。

  

  还有一点需要注意的是:

  ①saltstack操作windows可视化的时候有个问题,如果salt-minion是非手动以服务方式启动的话,是看不到任务窗口的,都会以SYSTEM这个用户以进程的方式在后台运行,解决之道是将salt-minion改为手动命令行启动。

  参考文档:http://www.mamicode.com/info-detail-1892884.html

  ②powershell参考文档:technet.microsoft.com/en-us/library

  pipeline中的代码示例:

  1. sh 'salt \'tp_inservice2\' cmd.run "start-process ZP.Crm.Task.Scheduler.Engine.exe -workingdirectory \'D:\\crmService\\ZP.Crm.Task.Scheduler.Engine1-huidu\'" shell=\'powershell\''

SaltStack远程执行Windows job程序(黑窗口)填坑经过的更多相关文章

  1. Saltstack远程执行(四)

    Saltstack远程执行 语法例:salt '*' cmd.run 'w' -  命令:salt -  目标:'*' -  模块:cmd.run,自带150+模块,也可以自己写模块 -  返回:执行 ...

  2. Linux远程执行Windows机器任务

    Linux远程执行Windows机器任务     近期测试人员提出需求需要在Linux下调用Windows系统下的cmd的命令完成自动构建和测试并生成测试报告. 环境: Windows Server2 ...

  3. Linux centosVMware 自动化运维认识自动化运维、启动salt相关服务、saltstack配置认证、salt-key命令用法、saltstack远程执行命令、saltstack - grains、saltstack – pillar

    一.认识自动化运维 传统运维效率低,大多工作人为完成 传统运维工作繁琐,容易出错 传统运维每日重复做相同的事情 传统运维没有标准化流程 传统运维的脚本繁多,不能方便管理 自动化运维就是要解决上面所有问 ...

  4. 远程登录 Windows server 2008 黑屏

    scenerio:  远程登录 Windows server 2008 黑屏,别人那里一切正常. Solution:在黑屏界面,点击桌面,按住Ctrl+Alt+End键 -> Log Off. ...

  5. 2、自动化运维之SaltStack远程执行详解

    SaltStack远程执行详解 ●目标(Targeting) ●模块(Module) ●返回(Returnners) 混合模式-C 选项 主机名设置参照: redis-node1-redis03-id ...

  6. 批量远程执行linux服务器程序--基于paramiko(多线程版)

    批量远程执行linux服务器程序--基于paramiko paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接 具体安装方法这里不写,网 ...

  7. SaltStack远程执行-返回MySQL

    上一篇:SaltStack远程执行-模块 参考官方文档:https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.my ...

  8. SaltStack入门篇(四)之深入理解SaltStack远程执行

    1.目标 2.执行模块 3.返回 salt ‘*’ cmd.run ‘uptime’ 命令 目标 执行模块 执行模块参数 1.SlatStack远程执行–目标 执行目标:https://docs.sa ...

  9. saltstack远程执行命令.md

    saltstack 支持在master上向client 远程执行命令,并显示命令执行的结果 命令格式: salt '<操作目标>' <方法> [参数] 示例 示例1 ping检 ...

随机推荐

  1. [Python]PDF合成小程序PDF合成小程序

    运行平台:Python3.5 用刀了PyPDF2这个库,需要提前下载好. 源码如下: import PyPDF2, os #建立一个装pdf文件的数组pdfFiles = [] for fileNam ...

  2. 剑指offer——33分行从上到下打印二叉树

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行.   题解: 使用BFS,按层打印即可 class Solution { public: vector<vector&l ...

  3. 网络安全系列 之 TLS/SSL基本原理

    1. TLS/SSL基本工作方式: TLS/SSL的功能实现主要依赖于三类基本算法(参见"网络安全系列 之 密码算法"): 非对称加密算法:实现身份认证和密钥协商 对称加密算法: ...

  4. <Django>博客项目

    0.项目的通用流程 项目立项 需求分析 原型 前端 页面设计 UI及交互实现 后端 架构设计 数据库设计 代码模板实现 单元测试 网站整合 功能及集成测试 网站发布 1.BBS项目需求分析 需要哪些表 ...

  5. jdbc_mysql----函数助手参数化

    第一个值填写的是文件路径 第二个值填写的是从第几个开始执行,从0开始

  6. java笔试之从单向链表中删除指定值的节点

    输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针. 链表的值不能重复 构造过程,例如 1 -> 2 3 -> 2 5 -> 1 4  ...

  7. Mybatis 使用Mapper接口的Sql动态代码方式进行CURD和分页查询

    1.Maven的pom.xml 2.配置文件 2.1.db.properties 2.2.mybatis.xml 2.3.log4j.xml 3.MybatisUtil工具类 4.Mapper映射文件 ...

  8. day12 bash中的if、for

    bash 变量bash 定义:x= 作用:记录状态 规则:字母开头,后面可以接字母.数字.下划线 export args:将变量定义为全局变量 $$[]:括号中可以进行简单的数学整数运算,可以用ech ...

  9. 全球轮3——cf1148

    c——贪心构造题 /* 1 [n/2+1,n] 2 [n/2+2,n] ... n/2 [n,n] n/2+1 [1,1] n/2+2 [1,2] ... n [1,n/2] ai要换到位置ai上,用 ...

  10. (转)第05节:Fabric.js的动画设置

    凡是出色的Canvas库都少不了制作动画的方法,Fabric.js也不例外,它有着编写简单且功能强大的动画助手,这就是animate( )方法. animate主要使用代码如下: rect.anima ...