【问题标题】:How to run a shellscript from backgorund in Jenkins如何在 Jenkins 中从后台运行 shell 脚本
【发布时间】:2021-01-01 10:10:08
【问题描述】:

我有以下命令,但它不工作,我看到进程被自动创建并杀死

BUILD_ID=dontKillMe nohup /Folder1/job1.sh > /Folder2/Job1.log 2>&1 &

Jenkins 输出:

[ssh-agent] Using credentials user1 (private key for user1)
[job1] $ /bin/sh -xe /tmp/jenkins19668363456535073453.sh

    + BUILD_ID=dontKillMe
    + nohup /Folder1/job1.sh
    $ ssh-agent -k
    unset SSH_AUTH_SOCK;
    unset SSH_AGENT_PID;
    echo Agent pid 8765 killed;
    [ssh-agent] Stopped.
    Finished: SUCCESS

【问题讨论】:

  • 是 2 个 cmds 吗? 1)BUILD_ID=dontKillMe (插入换行符或";") 2) nohup ... & ?你的“管道步骤”是什么?
  • 是什么让你认为你的脚本被杀死了?上面的输出只是表明现有的ssh-agent 被杀死,这是选项-k 的预期行为。
  • @Alex 触发构建后,我看不到作业正在我的机器上运行。所以这就是输出。我的想法是它(jobs.sh)应该在后台运行。当我使用 ps -ef| grep jobs.sh,我没有看到作业正在运行。这意味着这个 jenkins 作业触发了 Job1.sh 并杀死了它。
  • 你能发布job1.sh的(相关)内容吗?从输出来看,该脚本似乎只是调用了ssh-agent -k,然后正常终止。

标签: jenkins jenkins-pipeline jenkins-plugins jenkins-groovy jenkins-job-dsl


【解决方案1】:

我已经运行了一个没有 nohup 的命令,所以你可以尝试使用:

sh """
    BUILD_ID=dontKillMe /Folder1/job1.sh > /Folder2/Job1.log 2>&1 &
"""

就我而言,我不需要将 STDERR 重定向到 STDOUT,因为我正在运行的进程捕获了所有错误并直接显示在 STDOUT 上。

【讨论】:

    【解决方案2】:

    我们为此使用daemonize。它会在后台正确启动程序,并且不会在父进程 (bash) 退出时将其杀死。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      相关资源
      最近更新 更多