Jenkins踩坑之旅:nohup後臺執行shell命令

滕瑞發表於2019-07-10

有時我們希望將某個命令放在後臺執行,然後並行(非同步)執行其他命令。但在Jenkins上很容易遇到無法真正將命令放到後臺執行的問題。

原因是pipeline在退出node{}的時候,會預設清理自己發出的每個shell命令,即使使用了nohup。

例如如下程式碼無法在後續的程式查詢中找到top程式

pipeline {
    agent {
        label 'master'
    }
    stages {
        stage('Example') {
            steps {
                script {
                    node("vm-1") {
                        sh "nohup top -b > /dev/null &"
                    }
                    node("vm-1") {
                        sh "ps -ef | grep top"
                    }
                }
            }
        }
    }
}

執行結果如下

[Pipeline] sh
+ grep top
+ ps -ef
tengrui   21907  21904  0 06:10 ?        00:00:00 grep top

解決方法是加入環境變數BUILD_ID=DONTKILLME

pipeline {
    agent {
        label 'master'
    }
    stages {
        stage('Example') {
            steps {
                script {
                    node("vm-1") {
                        sh "BUILD_ID=dontKillMe nohup top -b > /dev/null &"
                    }
                    node("vm-1") {
                        sh "ps -ef | grep top"
                    }
                }
            }
        }
    }
}

執行結果如下

[Pipeline] sh
+ ps -ef
+ grep top
tengrui   21915      1  1 06:11 ?        00:00:00 top -b
tengrui   21925  21922  0 06:11 ?        00:00:00 grep top

注:

  1. 當pipeline退出node{}程式碼塊的時候,才會清理shell程式
  2. 也可以使用JENKINS_NODE_COOKIE=dontKillMe

相關文章