Living a Simple Life is a Happy Life

有饭吃,自由自在,就非常开心

How to Write Standard Startup Script

| Comments

centos6中的init.d systemV script升级为systemd startup script,让我们有个easy setup的模板…

模板实例:

systemV init script template

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/bin/bash

# testclient - Startup script for testclient

# chkconfig: 35 85 15
# description: testclient is your openstack VMS monitor and ovs auto config bot.
# processname: testclient
# config: /etc/testclient.conf

. /etc/rc.d/init.d/functions

# NOTE: if you change any OPTIONS here, you get what you pay for:
# this script assumes all options are in the config file.
CONFIGFILE="/etc/testclient.conf"

testCLIENT=/usr/local/bin/testclient

testCLIENT_USER=helloworldtest
testCLIENT_GROUP=helloworldtest

# things from testclient.conf get there by testclient reading it
PIDFILEPATH=`awk -F'[:=]' -v IGNORECASE=1 '/^[[:blank:]]*(processManagement\.)?pidFilePath[[:blank:]]*[:=][[:blank:]]*/{print $2}' "$CONFIGFILE" | tr -d "[:blank:]\"'" | aw
PIDDIR=`dirname $PIDFILEPATH`
LOGFILEPATH=`awk -F'[:=]' -v IGNORECASE=1 '/^[[:blank:]]*(processManagement\.)?logFilePath[[:blank:]]*[:=][[:blank:]]*/{print $2}' "$CONFIGFILE" | tr -d "[:blank:]\"'" | aw
LOGDIR=`dirname $LOGFILEPATH`

OPTIONS=" -c $CONFIGFILE"

start()
{
  # Make sure the default pidfile directory exists
  if [ ! -d $PIDDIR ]; then
    install -d -m 0755 -o $testCLIENT_USER -g $testCLIENT_GROUP $PIDDIR
  fi
  if [ ! -d $LOGDIR ]; then
    install -d -m 0755 -o $testCLIENT_USER -g $testCLIENT_GROUP $LOGDIR
  fi

  echo -n $"Starting testclient: "
  daemon --pidfile "$PIDFILEPATH" --user "$testCLIENT_USER" --check $testCLIENT "$testCLIENT $OPTIONS >$LOGFILEPATH 2>&1 &"

  RETVAL=$?
  pid=`ps -A x | grep $testCLIENT | grep -v grep | cut -d" " -f1 | head -n 1`
  if [ -n "$pid" ]; then
          echo $pid > $PIDFILEPATH
  fi

  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/testclient
  echo
  return $RETVAL
}

stop()
{
  echo -n $"Stopping testclient: "
  testclient_killproc "$PIDFILEPATH" $testCLIENT
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/testclient
}

restart () {
        stop
        start
}

# Send TERM signal to process and wait up to 300 seconds for process to go away.
# If process is still alive after 300 seconds, send KILL signal.
# Built-in killproc() (found in /etc/init.d/functions) is on certain versions of Linux
# where it sleeps for the full $delay seconds if process does not respond fast enough to
# the initial TERM signal.
testclient_killproc()
{
  local pid_file=$1
  local procname=$2
  local -i delay=10
  local -i duration=1
  local pid=`pidofproc -p "${pid_file}" ${procname}`

  kill -TERM $pid >/dev/null 2>&1
  usleep 1000
  local -i x=0
  while [ $x -le $delay ] && checkpid $pid; do
    sleep $duration
    x=$(( $x + $duration))
  done

  kill -KILL $pid >/dev/null 2>&1
  usleep 1000

  checkpid $pid # returns 0 only if the process exists
  local RC=$?
  [ "$RC" -eq 0 ] && failure "${procname} shutdown" || rm -f "${pid_file}"; success "${procname} shutdown"
  RC=$((! $RC)) # invert return code so we return 0 when process is dead.
  return $RC
}

RETVAL=0

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart|reload|force-reload)
    restart
    ;;
  condrestart)
    [ -f $PIDFILEPATH] && restart || :
    ;;
  status)
    status $testCLIENT
    RETVAL=$?
    ;;
  *)
    echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
    RETVAL=1
esac

exit $RETVAL

systemd startup script template

helloworld.conf

1
2
3
4
5
node = 1

[system]
pidFilePath=/var/lib/helloworldtest/run/hello.pid
logFilePath=/var/lib/helloworldtest/log/hello.log

/usr/lib/systemd/system/helloworld.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=helloworld

[Service]
Type=forking
EnvironmentFile=/etc/helloworld.conf
ExecStartPre=/bin/sh -c '/bin/install -d -m 0755 -o root -g root $( /usr/bin/dirname ${logFilePath} )'
ExecStartPre=/bin/sh -c '/bin/install -d -m 0755 -o root -g root $( /usr/bin/dirname ${pidFilePath} )'
ExecStart=/usr/local/sbin/daemonize -p ${pidFilePath} -a -o ${logFilePath} -e ${logFilePath} /usr/local/bin/helloworld -c /etc/helloworld.conf
ExecStopPost=/bin/kill $MAINPID
Restart=always

[Install]
WantedBy=default.target

Comments