dimedrol90
dimedrol90

Reputation: 276

Jenkins with Publish over SSH plugin, -1 exit status

I use Jenkins for build and plugin for deploy my artifacts to server. After deploying files I stopped service by calling eec in plugin

sudo service myservice stop

and I receive answer from 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

The build is failed but the service is stopped.

My /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

Please say me why I get -1 exit status?

Upvotes: 1

Views: 14753

Answers (2)

dimedrol90
dimedrol90

Reputation: 276

Yes, Jan Hudec is right. I call ps ax | grep myservice in Publish over SSH plugin:

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

So pkill -f myservice will affect the process with PID 83469 which is parent for pkill. This is -1 status cause as I understand.

I changed pkill -f myservice to pkill -f "java.*myservice" and this solved my problem.

Upvotes: 1

Jan Hudec
Jan Hudec

Reputation: 76266

Well, the script is called /etc/init.d/myservice, so it matches the myservice pattern given to pkill -f. And because the script is waiting for the pkill to complete, it is still alive and gets killed and returns -1 for that reason (there is also the killing signal in the result of wait, but the Jenkins slave daemon isn't printing it).

Either:

  • come up with more specific pattern for pkill,
  • use proper pid-file or
  • switch to systemd, which can reliably kill exactly the process it started.

On this day and age, I recommend the last option. Systemd is simply lot more reliable than init scripts.

Upvotes: 4

Related Questions