Bash Jenkins反向运行shell脚本?

Bash Jenkins反向运行shell脚本?,bash,jenkins,tomcat6,sh,jenkins-plugins,Bash,Jenkins,Tomcat6,Sh,Jenkins Plugins,我的jenkins服务器存在以相反顺序运行shell命令的问题。 我指定要运行的命令 将文件复制到另一台服务器 运行更新脚本 比如说, $nohup scp -i .ssh/blah -o StrictHostKeyChecking=no foo.txt tomcat@foo.coo.com:/tmp/FOO.txt &> /dev/null $nohup ssh -t -t -n -i .ssh/blah -o StrictHostKeyChecking=no tomcat@fo

我的jenkins服务器存在以相反顺序运行shell命令的问题。 我指定要运行的命令

  • 将文件复制到另一台服务器
  • 运行更新脚本
  • 比如说,

    $nohup scp -i .ssh/blah -o StrictHostKeyChecking=no foo.txt tomcat@foo.coo.com:/tmp/FOO.txt &> /dev/null
    $nohup ssh -t -t -n -i .ssh/blah -o StrictHostKeyChecking=no tomcat@foo.coo.com '/home/tomcat/bin/update.sh /tmp/FOO.txt.war'
    
    相反,jenkins输出控制台将显示:

  • 正在运行update.sh
  • 在文件上复制
  • 当我将两个命令配对为一个命令时,同样的问题也会发生&& 我在詹金斯的所有工作都是如此

    我目前正在tomcat6服务器上运行jenkins 1.469

    任何帮助都将不胜感激,谢谢

    编辑:

    我将这些命令作为每个作业的批处理任务运行。问题似乎不在詹金斯身上,因为这是正确的

    [workspace] $ /bin/sh -xe /tmp/tomcat6-tomcat6-tmp/hudson8724999678434432030.sh
    + echo 1
    1
    + echo 2
    2
    + echo 3
    3
    + echo 4
    4
    

    使用
    &>
    重定向stdout和stderr是bashshell的一个特性。如果您想使用bash特定的特性,那么需要让Jenkins知道应该使用bash执行构建步骤

    这可以通过两种方式实现:

    1) 更改Jenkins全局配置中的默认shell或

    2) 构建步骤的第一行必须以
    #开头/bin/bash…


    请注意,
    /bin/sh
    并不总是指向
    /bin/bash

    的符号链接。您是否尝试过将这两个命令保存在一个文件中,省略
    nohup
    ,并调用该脚本文件?我的jenkins作业的设置方式阻止我将命令移动到脚本文件中,因为它们都是批处理任务。但是,我知道如果从单个脚本执行,它将正确运行。所以问题可能不在詹金斯身上——你是在为第一项任务打基础,然后立即开始下一项任务。如果完成第一个命令所需的时间大于完成第二个命令所需的时间,那么第一个命令当然会提前完成。如果这些事情的顺序真的很重要,为什么不直接将第一个命令放在后台运行呢?所有命令都不应该在后台运行,因为&>/dev/null应该将stderr重定向到stout。还是我错了?我删除了&它成功了=虽然我仍然想知道为什么它被视为后台作业而不是重定向,但我错误地认为/bin/sh与/bin/bash有符号链接,但事实并非如此。因此,我创建了一个到bash的符号链接,所有内容都已备份并运行。谢谢这是解决问题的一种方法。如果操作系统更新覆盖了/bin/sh,您可能需要继续重新解决它。另外,请注意,默认情况下,-xe选项附加到shell中。如果要保留此行为(-x在执行命令之前回显每个命令-方便!--如果任何命令返回非零状态代码,e将使脚本失败-否则您的shell步骤永远不会失败!-),如果使用选项#2,则使用#/bin/bash-xe