Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Jenkins在服务器上运行ssh命令_Jenkins_Ssh_Server_Centos - Fatal编程技术网

从Jenkins在服务器上运行ssh命令

从Jenkins在服务器上运行ssh命令,jenkins,ssh,server,centos,Jenkins,Ssh,Server,Centos,我有一个詹金斯舞台: stage("Deploy on Server") { steps { script { sh 'sshpass -p "password" ssh -o "StrictHostKeyChecking=no" username@server "cd ../../to/app/path; sh redeploy.sh && exit;"'

我有一个詹金斯舞台:

stage("Deploy on Server") {
   steps {
      script {
          sh 'sshpass -p "password" ssh -o "StrictHostKeyChecking=no" username@server "cd ../../to/app/path; sh redeploy.sh && exit;"'
      }
   }
}
以及我的服务器(centos)上的一些脚本:

重新部署。sh:

declare -i result=0
...
sh restart.sh
result+=$?
echo "Step 6: result = " $result

# 7. if restart fail, restart /versions/*.jar "sh restart-previous.sh"
if [ $result != "0" ]
  then
    sh restart-previous.sh
    result+=$?
fi

echo "Deploy done. Final result: " $result
重新启动.sh

nohup java -Xms8g -Xmx8g -jar app-name-1.0-allinone.jar &
if pgrep -u username -f app-name
  then 
    pkill -u username -f app-name
fi
# (app-name is a string, some words from the running cmd to open tha application)
因为我从Jenkins执行了redeploy.sh脚本,所以问题是它会挂在Jenkins控制台上,并在那里记录所有应用程序事件,而不是在部署我的应用程序的补丁中创建一个nohup文件

在一些示例中,我发现建议在ssh命令中直接使用nohup,但我不能这样做,因为我需要执行一个脚本(包括所有步骤,nohup无法执行),而不是直接执行一个命令

exit
cmd将被忽略,因为上一个命令永远不会关闭


谢谢

最后,我找到了解决办法。一个问题出现在
restart.sh
中,因为需要从cmd强制指定日志文件。因此,
nohup
被忽略/未使用,命令变为:

java -Xms8g -Xmx8g -jar app-name-1.0-allinone.jar </dev/null>> logfile.log 2>&1 &
停止。sh

nohup java -Xms8g -Xmx8g -jar app-name-1.0-allinone.jar &
if pgrep -u username -f app-name
  then 
    pkill -u username -f app-name
fi
# (app-name is a string, some words from the running cmd to open tha application)
由于Jenkins脚本中的
app folder
stop.sh中的
app name
是相等的(甚至app folder包含app name值),当您试图终止
app name进程时,您会意外地终止ssh连接,Jenkins将获得
255状态码
,但是来自服务器的
redeploy.sh
脚本将成功完成,因为它将独立执行

解决方案很简单,但很难被发现。您应该确保为搜索命令指定了一个明确的名称,该命令将仅查找应用程序的进程id

最后,
stop.sh
必须为:

if pgrep -u username -f my-app-v1.0.jar
  then 
    pkill -u username -f my-app-v1.0.jar
fi

您是否使用声明性管道?在jenkins控制台输出中打印数据时,
restart.sh
有什么问题?我建议您让它在
控制台输出中打印
,但要找到一种方法来屏蔽包含敏感数据的参数,以便在jenkins控制台输出中显示为
******
。我还建议您使用shell语法,如这里概述的
sh''echo“这是我的shell脚本”''
:Ref:I找到了一种方法。。。需要强制从cmd登录到日志文件,如“nohup java-Xms8g name.jar>logfile.log 2>&1&”。这是在centos服务器中。但是,问题是当我试图终止现有进程时,因为在jenkins中,即使命令成功执行,也会返回错误255:def statusCode=sh returnStatus:true,脚本的sshpass-p passwordusername@serversh重新部署,sh'