【问题标题】:Jenkins with Publish over SSH plugin, -1 exit statusJenkins 通过 SSH 插件发布,-1 退出状态
【发布时间】:2016-02-11 17:05:54
【问题描述】:

我使用 Jenkins 进行构建,使用插件将我的工件部署到服务器。部署文件后,我通过在插件中调用 eec 来停止服务

sudo service myservice stop

我收到来自 Publish over SSH 的答复:

SSH: EXEC: channel open
SSH: EXEC: STDOUT/STDERR from command [sudo service myservice stop]...
SSH: EXEC: connected
Stopping script myservice
SSH: EXEC: completed after 200 ms
SSH: Disconnecting configuration [172.29.19.2] ...
ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [-1]]
Build step 'Send build artifacts over SSH' changed build result to UNSTABLE
Finished: UNSTABLE

构建失败但服务已停止。

我的 /etc/init.d/myservice

#! /bin/sh
# /etc/init.d/myservice
#
# Some things that run always
# touch /var/lock/myservice
# Carry out specific functions when asked to by the system
case "$1" in
  start)
      echo "Starting myservice"
      setsid /opt/myservice/bin/myservice --spring.config.location=/etc/ezd/application.properties --server.port=8082 >> /opt/myservice/app.log &
  ;;
  stop)
      echo "Stopping script myservice"
      pkill -f myservice 
      #
  ;;
  *)
      echo "Usage: /etc/init.d/myservice {start|stop}"
      exit 1
  ;;
esac
exit 0

请告诉我为什么我得到 -1 退出状态?

【问题讨论】:

    标签: jenkins ssh


    【解决方案1】:

    好吧,脚本被称为/etc/init.d/myservice,因此它与pkill -fmyservice 模式相匹配。并且因为脚本正在等待pkill 完成,所以它仍然活着并被杀死并因此返回-1(等待结果中也有杀死信号,但詹金斯从属守护进程没有打印它)。

    要么:

    • 想出更具体的 pkill 模式,
    • 使用正确的 pid 文件或
    • 切换到 systemd,它可以可靠地准确杀死它启动的进程。

    在这个时代,我推荐最后一个选项。 Systemd 比初始化脚本更可靠。

    【讨论】:

      【解决方案2】:

      是的,Jan Hudec 是对的。我在 Publish over SSH 插件中调用 ps ax | grep myservice

       83469 pts/5    Ss+    0:00 bash -c ps ax | grep myservice service myservice stop  
      

      所以pkill -f myservice 会影响 PID 为 83469 的进程,它是 pkill 的父进程。据我了解,这是-1 状态原因。

      我将pkill -f myservice 更改为pkill -f "java.*myservice",这解决了我的问题。

      【讨论】:

      • 我仍然建议查看systemd 或至少start-stop-daemon 实用程序。它们是为 Linux 编写服务的更可靠的方式。
      • 好的,一月。我会用谷歌搜索它。非常感谢您的回答!