【问题标题】:How to execute a windows batch command in Jenkins that is not killed?如何在 Jenkins 中执行未被杀死的 windows 批处理命令?
【发布时间】:2019-01-07 14:39:14
【问题描述】:

我正在尝试使用 Windows 批处理命令从 Jenkins 作业启动两个进程:

REM start Selenium drivers if needed
cd "%WORKSPACE%\Uca.SeleniumTests"
start "" powershell -ExecutionPolicy unrestricted -file ./startDrivers.ps1

startDrivers.ps1

$isGeckoDriverProcessOn = Get-Process geckodriver -ErrorAction SilentlyContinue
if(!$isGeckoDriverProcessOn){   
    Write-Host 'Starting geckodriver'   
    Start-Process -FilePath "geckodriver.exe"
} 

#$startChromeDriver = (Get-Item -Path ".\" -Verbose).FullName
$isChromeDriverProcessOn = Get-Process chromedriver -ErrorAction SilentlyContinue
if(!$isChromeDriverProcessOn){    
    Write-Host 'Starting chromedriver'
    Start-Process -FilePath "chromedriver.exe" 
}

当从命令提示符运行时,这可以正常工作,但是当从 Jenkins 运行时,尽管尝试在另一个会话中运行,进程会立即被终止 (start)。

Jenkins slave 是从命令提示符启动的,我可以看到进程窗口显示了半秒钟。我的感觉是 Jenkins 正在杀死命令行会话以及这些进程。

问题:如何在Jenkins中执行不被杀死的windows批处理命令?

【问题讨论】:

  • 也许在您的批处理文件末尾添加pause 以查看是否出现错误。这可能是powershell脚本路径的语法错误。我无法测试这个,没有詹金斯环境..
  • @GerhardBarnard - 是的,这是有道理的。我现在无法连接到工作以尝试,但我会尝试并回来。
  • 一切都好。试过后告诉我。
  • @GerhardBarnard - PAUSE 被 Jenkins 忽略(它输出 Press any key... ,终止进程并进入下一步)。但是,我意识到我没有提出正确的问题,并基于此提供了答案。谢谢。
  • 酷,很高兴我的无用帮助实际上有所帮助:)

标签: batch-file jenkins process


【解决方案1】:

我意识到我问错了问题,正确的问题是:如何确保 Jenkins 使用的某些进程是长期存在的?

按照this questionPrcessTreeKiller看来,Jenkins似乎旨在尽快清理所有正在运行的进程:

为了在构建过程中可靠地终止作业产生的进程,Jenkins 包含一些本地代码来列出这些进程并杀死它们。

虽然上述问题提到了一些克服这个问题的方法,但很明显,推荐的方法是不要通过作业步骤产生长时间运行的处理,而是在 Jenkins 之外(例如,运行计划任务以确保进程正在运行)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2015-12-05
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多