jenkins 6.87 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# /etc/init.d/jenkins
# debian-compatible jenkins startup script.
# Amelia A Lewis <alewis@ibco.com>
#
### BEGIN INIT INFO
# Provides:          jenkins
# Required-Start:    $remote_fs $syslog $network
# Required-Stop:     $remote_fs $syslog $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start Jenkins at boot time
13
# Description:       Controls Jenkins Automation Server
14
15
16
17
### END INIT INFO

PATH=/bin:/usr/bin:/sbin:/usr/sbin

18
DESC="Jenkins Automation Server"
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
NAME=jenkins
SCRIPTNAME=/etc/init.d/$NAME

[ -r /etc/default/$NAME ] && . /etc/default/$NAME

#DAEMON=$JENKINS_SH
DAEMON=/usr/bin/daemon
DAEMON_ARGS="--name=$NAME --inherit --env=JENKINS_HOME=$JENKINS_HOME --output=$JENKINS_LOG --pidfile=$PIDFILE"

if [ -n "$UMASK" ]; then
    DAEMON_ARGS="$DAEMON_ARGS --umask=$UMASK"
fi

SU=/bin/su

# Exit if the package is not installed
if [ ! -x "$DAEMON" ]; then
    echo "daemon package not installed" >&2
    exit 1
fi

# Exit if not supposed to run standalone
if [ "$RUN_STANDALONE" = "false" ]; then
    echo "Not configured to run standalone" >&2
    exit 1
fi

# load environments
if [ -r /etc/default/locale ]; then
  . /etc/default/locale
  export LANG LANGUAGE
elif [ -r /etc/environment ]; then
  . /etc/environment
  export LANG LANGUAGE
fi

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# Make sure we run as root, since setting the max open files through
# ulimit requires root access
if [ `id -u` -ne 0 ]; then
    echo "The $NAME init script can only be run as root"
    exit 1
fi


check_tcp_port() {
    local service=$1
    local assigned=$2
    local default=$3
74
75
    local assigned_address=$4
    local default_address=$5
76

77
    if [ -n "$assigned" ]; then
78
79
80
81
        port=$assigned
    else
        port=$default
    fi
82
83
84
85
86
87
88
89

    if [ -n "$assigned_address" ]; then
        address=$assigned_address
    else
        address=$default_address
    fi

    count=`netstat --listen --numeric-ports | grep $address\:$port[[:space:]] | grep -c . `
90

91
    if [ $count -ne 0 ]; then
92
93
        echo "The selected $service port ($port) on address $address seems to be in use by another program "
        echo "Please select another address/port combination to use for $NAME"
94
95
96
97
98
99
100
101
102
        return 1
    fi
}

#
# Function that starts the daemon/service
#
do_start()
{
103
104
105
106
107
    # java will store heap dumps here in case of OutOfMemoryError.
    # delete old heap dumps when starting
    rm -r "$JENKINS_HOME/heapDumps/" > /dev/null 2>&1 || true
    mkdir -p "$JENKINS_HOME/heapDumps/"
    chown ${JENKINS_USER}.${JENKINS_GROUP} "$JENKINS_HOME/heapDumps"
108
109
110
111
112
113
114
115
116
117
118
    # the default location is /var/run/jenkins/jenkins.pid but the parent directory needs to be created
    mkdir `dirname $PIDFILE` > /dev/null 2>&1 || true
    chown $JENKINS_USER `dirname $PIDFILE`
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    $DAEMON $DAEMON_ARGS --running && return 1

    # Verify that the jenkins port is not already in use, winstone does not exit
    # even for BindException
119
    check_tcp_port "http" "$HTTP_PORT" "8080" "$HTTP_HOST" "0.0.0.0" || return 2
120
121

    # If the var MAXOPENFILES is enabled in /etc/default/jenkins then set the max open files to the
122
123
124
125
126
    # proper value
    if [ -n "$MAXOPENFILES" ]; then
        [ "$VERBOSE" != no ] && echo Setting up max open files limit to $MAXOPENFILES
        ulimit -n $MAXOPENFILES
    fi
127

128
129
130
131
132
133
134
135
136
137
138
139
140
141
    # notify of explicit umask
    if [ -n "$UMASK" ]; then
        [ "$VERBOSE" != no ] && echo Setting umask to $UMASK
    fi

    # --user in daemon doesn't prepare environment variables like HOME, USER, LOGNAME or USERNAME,
    # so we let su do so for us now
    $SU -l $JENKINS_USER --shell=/bin/bash -c "$DAEMON $DAEMON_ARGS -- $JAVA $JAVA_ARGS -jar $JENKINS_WAR $JENKINS_ARGS" || return 2
}


#
# Verify that all jenkins processes have been shutdown
# and if not, then do killall for them
142
143
#
get_running()
144
{
145
    return `ps -U $JENKINS_USER --no-headers -f | egrep -e '(java)' | grep -v defunct | grep -c . `
146
147
}

148
force_stop()
149
150
{
    get_running
151
    if [ $? -ne 0 ]; then
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
	killall -u $JENKINS_USER java daemon || return 3
    fi
}

# Get the status of the daemon process
get_daemon_status()
{
    $DAEMON $DAEMON_ARGS --running || return 1
}


#
# Function that stops the daemon/service
#
do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
173
    get_daemon_status
174
    case "$?" in
175
	0)
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
	    $DAEMON $DAEMON_ARGS --stop || return 2
        # wait for the process to really terminate
        for n in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
            sleep 1
            $DAEMON $DAEMON_ARGS --running || break
        done
        if get_daemon_status; then
	        force_stop || return 3
        fi
	    ;;
	*)
	    force_stop || return 3
	    ;;
    esac

    # Many daemons don't delete their pidfiles when they exit.
    rm -f $PIDFILE
    return 0
}

Holger Levsen's avatar
Holger Levsen committed
196
197
198
199
200
201
202
# Verify the process did in fact start successfully and didn't just bomb out
do_check_started_ok() {
    sleep 1
    if [ "$1" -ne "0" ]; then return $1; fi
    get_running
    if [ "$?" -eq "0" ]; then
        return 2
203
    else
Holger Levsen's avatar
Holger Levsen committed
204
205
206
207
        return 0
    fi
}

208
209
210
211
case "$1" in
  start)
    log_daemon_msg "Starting $DESC" "$NAME"
    do_start
Holger Levsen's avatar
Holger Levsen committed
212
213
    START_STATUS="$?"
    do_check_started_ok "$START_STATUS"
214
215
    case "$?" in
        0|1) log_end_msg 0 ;;
Holger Levsen's avatar
Holger Levsen committed
216
        2) log_end_msg 1 ; exit 7 ;;
217
218
219
220
221
222
223
    esac
    ;;
  stop)
    log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
        0|1) log_end_msg 0 ;;
Holger Levsen's avatar
Holger Levsen committed
224
        2) log_end_msg 1 ; exit 100 ;;
225
226
227
228
229
230
231
232
233
234
235
236
    esac
    ;;
  restart|force-reload)
    #
    # If the "reload" option is implemented then remove the
    # 'force-reload' alias
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
        do_start
Holger Levsen's avatar
Holger Levsen committed
237
238
239
        START_STATUS="$?"
        sleep 1
        do_check_started_ok "$START_STATUS"
240
241
        case "$?" in
          0) log_end_msg 0 ;;
Holger Levsen's avatar
Holger Levsen committed
242
243
          1) log_end_msg 1 ; exit 100 ;; # Old process is still running
          *) log_end_msg 1 ; exit 100 ;; # Failed to start
244
245
246
247
248
249
250
251
252
253
        esac
        ;;
      *)
  	# Failed to stop
	log_end_msg 1
	;;
    esac
    ;;
  status)
	get_daemon_status
254
255
	case "$?" in
	 0)
256
257
258
		echo "$DESC is running with the pid `cat $PIDFILE`"
		rc=0
		;;
259
	*)
260
261
		get_running
		procs=$?
262
		if [ $procs -eq 0 ]; then
263
			echo -n "$DESC is not running"
264
			if [ -f $PIDFILE ]; then
265
266
				echo ", but the pidfile ($PIDFILE) still exists"
				rc=1
267
			else
268
269
270
				echo
				rc=3
			fi
271
272

		else
273
274
275
276
			echo "$procs instances of jenkins are running at the moment"
			echo "but the pidfile $PIDFILE is missing"
			rc=0
		fi
277

278
279
280
281
282
283
284
285
286
287
288
		exit $rc
		;;
	esac
	;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
    exit 3
    ;;
esac

exit 0