【问题标题】:Jenkins execute part of shell scriptJenkins 执行部分 shell 脚本
【发布时间】:2019-08-07 11:17:56
【问题描述】:

我正在使用这个脚本来升级我的应用程序:

#!/usr/bin/env bash

set -u

set -e

set -x


JAVA_HOME="/opt/dabai/tools/jdk1.8.0_211"
APP_HOME="/data/jenkins/soa-robot-service"
APP_NAME="soa-robot-service-1.0.0-SNAPSHOT.jar"

PID=`ps -ef|grep -w ${APP_NAME}|grep -v grep|cut -c 9-15`
if [[ ${PID} -gt 1 ]]; then
        kill -9 ${PID}
        sleep 5
else
        echo "Process not found"
fi

count=`ps -ef | grep ${APP_NAME} | grep -v "grep" | wc -l`
if [[ ${count} -lt 1 ]]; then
  cd ${APP_HOME}
  nohup ${JAVA_HOME}/bin/java -Xmx512M -Xms256M -jar \
  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt \
  -Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=5009 \
  ${APP_HOME}/${APP_NAME} >> ${APP_HOME}/soa-robot.log &
else
  echo "process aready exists!"
  exit 1
fi

当我在终端中执行时,它工作正常。当我使用远程 ssh(通过使用 jenkins 插件)在 Jenkins(Jenkins 版本 2.164.3)中执行时,这是命令:

# add executable privillege
chmod +x /data/jenkins/soa-room-service/upgrade.sh
# upgrade app
/bin/bash /data/jenkins/soa-room-service/upgrade.sh

它只执行部分shell脚本,这是输出:

[SSH] script:

# add executable privillege
chmod +x /data/jenkins/soa-room-service/upgrade.sh
# upgrade app
/bin/bash /data/jenkins/soa-room-service/upgrade.sh

[SSH] executing...
+ JAVA_HOME=/opt/dabai/tools/jdk1.8.0_211
+ APP_HOME=/data/jenkins/soa-room-service
+ APP_NAME=soa-room-service-1.0.0-SNAPSHOT.jar
++ ps -ef
++ grep -w soa-room-service-1.0.0-SNAPSHOT.jar
++ grep -v grep
++ cut -c 9-15
+ PID=' 16309 '
+ [[  16309  -gt 1 ]]
+ kill -9 16309
+ sleep 5
++ grep soa-room-service-1.0.0-SNAPSHOT.jar
++ grep -v grep
++ ps -ef
++ wc -l
+ count=0
+ [[ 0 -lt 1 ]]
+ cd /data/jenkins/soa-room-service

[SSH] completed
[SSH] exit-status: 0

Finished: SUCCESS

最后这个命令没有执行(最后app没有运行)。但是当我第二次运行时,脚本执行完美。这让我很困惑,问题出在哪里?我应该怎么解决?

【问题讨论】:

  • 你能展示一下你是如何执行它的吗?您使用 Jenkinsfile 还是脚本化管道?
  • 我添加了使用 shell 脚本的方法,而不是 jenkinsfile.@mkemmerz

标签: jenkins


【解决方案1】:

您能否尝试从 cd ${APP_HOME} 之后的命令中删除 nohup 和 &。 似乎输出没有在标准输出中被捕获,因为进程在 Jenkins shell 的后台运行。

【讨论】:

    【解决方案2】:

    我终于找到了nohup命令不执行的原因。当我执行nohup命令时,nohup需要时间来启动命令。如果你注销或退出太快,可能会导致nohup没有足够的时间来启动命令。启动后台进程。所以解决这个问题,你应该尝试在nohup命令之后添加一些命令,比如:

    sleep 3
    

    脚本最终可能是这样的:

    count=`ps -ef | grep ${APP_NAME} | grep -v "grep" | wc -l`
    if [[ ${count} -lt 1 ]]; then
      cd ${APP_HOME}
      nohup ${JAVA_HOME}/bin/java -Xmx512M -Xms256M -jar \
      -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt \
      -Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=5009 \
      ${APP_HOME}/${APP_NAME} >> ${APP_HOME}/soa-robot.log &
      sleep 3
    else
      echo "process aready exists!"
      exit 1
    fi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 2013-10-16
      • 2020-10-28
      相关资源
      最近更新 更多