目录

Systemctl Service Template

目录

Systemctl Service Template

在使用go开发linux系统服务时,经常需要把执行文件安装为linux系统服务,每次都要搜文档再写service文件。特此准备了一个service文件的模板,修改前面的定义的几个变量即可。

主程序控制脚本模板

apisrv.sh

  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
#!/bin/sh
#
#
## chkconfig: 2345 67 92
## description: minio service

#执行程序启动所使用的系统用户
RUNNING_USER=root

###################################
#环境变量及程序执行参数
###################################
APP_EXE_NAME=xxxx
APP_NAME=xxxxx
APP_HOME=/data/xxxxxxxx
APP_BIN=${APP_HOME}/${APP_EXE_NAME}
DATA_DIR=${APP_HOME}/data

LOGFILE=${APP_HOME}/logs/${APP_NAME}.log

START_CMD="nohup ${APP_BIN} > ${LOGFILE} 2>&1 &"

#初始化psid变量(全局)
psid=0

checkpid() {
   pidps=`ps -ef|grep ${APP_EXE_NAME}|grep -v grep`
 
   if [ -n "${pidps}" ]; then
      psid=`echo ${pidps} | awk '{print $2}'`
   else
      psid=0
   fi
}

###################################
#(函数)启动程序
###################################
start() {
   checkpid
 
   if [ ${psid} -ne 0 ]; then
      echo "================================"
      echo "warn: ${APP_NAME} already started! (pid=${psid})"
      echo "================================"
   else
      echo -n "Starting ${APP_NAME}, data path: ${DATA_DIR} ..."
      su - ${RUNNING_USER} -c "${START_CMD}"
      checkpid
      if [ ${psid} -ne 0 ]; then
         echo "(pid=$psid) [OK]"
      else
         echo "[Failed]"
      fi
   fi
}

###################################
#(函数)停止程序
###################################
stop() {
   checkpid
   
   if [ ${psid} -ne 0 ]; then
      echo -n "Stopping ${APP_NAME} ...(pid=${psid}) "
      su - ${RUNNING_USER} -c "kill -9 ${psid}"
      if [ $? -eq 0 ]; then
         echo "[OK]"
      else
         echo "[Failed]"
      fi
 
      checkpid
      if [ ${psid} -ne 0 ]; then
         stop
      fi
   else
      echo "================================"
      echo "warn: ${APP_NAME} is not running"
      echo "================================"
   fi
}

###################################
#(函数)检查程序运行状态
###################################
status() {
   checkpid
 
   if [ ${psid} -ne 0 ];  then
      echo "${APP_NAME} is running! (pid=${psid})"
   else
      echo "${APP_NAME} is not running"
   fi
}

###################################
#读取脚本的第一个参数($1),进行判断
#参数取值范围:{start|stop|restart|status}
#如参数不在指定范围之内,则打印帮助信息
###################################
case "$1" in
   'start')
      start
      ;;
   'stop')
     stop
     ;;
   'restart')
     stop
     start
     ;;
   'status')
     status
     ;;
  *)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac 
exit 0

systemd service模板

apisrv.service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[Unit]
Description=A spider for bbc 6m english.

[Service]
WorkingDirectory=/dataxxx
ExecStartPre=
ExecStart=/data/xxx/apisrv.sh start
ExecReload=/data/xxx/apisrv.sh restart
ExecStop=/data/code/xxx/apisrv.sh stop

[Install]
WantedBy=multi-user.target

使用方法

复制上方的模板,保存为你想要的名称,比如apisrv.service,然后按以下步骤处理

1
2
3
4
chmod +x apisrv.service 
sudo cp  apisrv.service /etc/systemd/system/
sudo systemctl daemon-reload 
sudo systemctl enable apisrv.service 

如果你想不重启立刻使用这个sh脚本,就运行下面这句:

1
2
## 重启相关服务
$ sudo systemctl start apisrv.service