如果我们的系统没有部署成系统服务,那么当客户的机器意外宕机的时候,我们的应用程序需要手动开启,需要我们自己去维护,显得十分麻烦。

linux部署

在linux系统上部署系统服务时,我们需要知道linux系统的运行级别,也就是在操作系统启动的时候,运行我们的脚本,达到服务开机自启的功能。

linux运行级别

系统启动的时候,会有运行级别,会先运行对应级别的rc.d(如rc0.d,rc1.d),最后再运行rc.lcoal文件。

  1. #1,单用户。
  2. #2-5是多用户。
  3. 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
  4. 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
  5. 运行级别2:多用户状态(没有NFS)
  6. 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
  7. 运行级别4:系统未使用,保留
  8. 运行级别5X11控制台,登陆后进入图形GUI模式
  9. 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

使用Systemd配置系统服务

Systemd 是 linux系统工具,可以用来启动和管理守护进程,已成为大多数发行版本的标准配置。而systemctl则是其中一个管理系统的命令,这里我们使用了systemctl来管理系统服务。系统服务的位置在于/usr/lib/systemd/system。centos7系统下需要使用ini.d目录进行配置自启动服务。

制作nginx系统服务

  1. 使用yum安装nginx

    yum install -y nginx
    
  2. 查看nginx服务

    systemctl --type=service|grep nginx
    
  3. 启动nginx服务

    systemctl start nginx.service
    
  4. 设置nginx服务开启自启动 ```shell systemctl enable nginx.service

取消开机自启动

systemctl disable nginx.service

<a name="hGR3K"></a>
#### 
这里需要注意的是,如果没有用yum安装,并且还想使用systemctl来管理服务,那么需要自己弄一个nginx.service文件,然后放入/usr/lib/systemd/system目录。然后需要注意的是替换文件中nginx的安装目录。
```shell
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true

[Install]
WantedBy=multi-user.target

制作tomcat系统服务

制作tomcat系统服务的时候需要注意,在tomcat安装目录下的bin目录,创建setenv.sh文件,在其中指定tomcat进程的pid。

CATALINA_PID="$CATALINA_BASE/tomcat.pid"

tomcat服务的内容:

/usr/lib/systemd/system/tomcat.service

[Unit]
Description=Tomcat
After=syslog.targetnetwork.target remote-fs.target nss-lookup.target

[Service]
Type=forking
Environment="JAVA_HOME=/root/文档/jdk1.8.0_181"
PIDFile=/home/ourway/apache-tomcat-7.0.90/tomcat.pid
ExecStart=/home/ourway/apache-tomcat-7.0.90/bin/startup.sh
ExecStop=/home/ourway/apache-tomcat-7.0.90/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

制作java程序系统服务


这些脚本都需要有可执行权限,并且将service文件放入/usr/lib/systemd/system目录。

  1. 编写启动脚本
#!/bin/sh

export JAVA_HOME=/usr/java/jdk
export PATH=$JAVA_HOME/bin:$PATH
cd /usr/java
nohup java -jar wbs-service.jar > /dev/null  2>&1 &
echo $! > wbs-service.pid
  1. 编写关闭脚本
#!/bin/sh
PID=$(cat /var/run/wbs-service.pid)
kill -9 $PID

  1. 编写service文件 ```shell

    !/bin/sh

[Unit]

Description=wbs-service

After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

ExecStart=/usr/wbs-service-start.sh

ExecStop=/usr/wbs-service-stop.sh

PrivateTmp=true

[Install]

WantedBy=multi-user.target


4. 启动java程序服务
```shell
systemctl start wbs-service
  1. 设置nginx服务开启自启动 ```shell systemctl enable wbs-service

取消开机自启动

systemctl disable wbs-service

<a name="hKf7P"></a>
#### 
<a name="53c0q"></a>
### 使用init.d和chkconfig配置系统服务

chkconfig可以帮助我们快速的管理系统服务。centos6系统下需要使用ini.d目录进行配置自启动服务。
```shell
# 第一个运行级别参数
# 第二个是启动优先级
# 第三个是关闭优先级

# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
#              It has a lot of features, but it's not for everyone.

制作nginx系统服务

#!/bin/bash
#nx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
#              It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/var/run/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
   echo "nginx already running...."
   exit 1
fi
   echo -n $"Starting $prog: "
   daemon $nginxd -c ${nginx_config}
   RETVAL=$?
   echo
   [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
   return $RETVAL
}
# Stop nginx daemons functions.
stop() {
        echo -n $"Stopping $prog: "
        killproc $nginxd
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
}
# reload nginx service functions.
reload() {
    echo -n $"Reloading $prog: "
    #kill -HUP `cat ${nginx_pid}`
    killproc $nginxd -HUP
    RETVAL=$?
    echo
}
# See how we were called.
case "$1" in
start)
        start
        ;;
stop)
        stop
        ;;
reload)
        reload
        ;;
restart)
        stop
        start
        ;;
status)
        status $prog
        RETVAL=$?
        ;;
*)
        echo $"Usage: $prog {start|stop|restart|reload|status|help}"
        exit 1
esac
exit $RETVAL

制作tomcat系统服务

  1. 复制tomcat目录下的catalina.sh文件到/etc/init.d/目录下面,并重命名为tomcat
  2. 在脚本的开头 加上chkconfig配置

    #chkconfig:2345 10 90
    #description:Tomcat service
    
  3. 在脚本中设置环境变量

    CATALINA_HOME=/usr/java/tomcat
    JAVA_HOME=/usr/java/jdk8
    
  4. 给予脚本可执行权限

    chmod 755 /etc/init.d/tomcat
    
  5. 启动服务

    service tomcat start
    

    6.设置成开机自启动

    chkconfig tomcat on
    

制作java程序系统服务

  1. 制作启动脚本start.sh

    nohup java -jar dceApi-0.0.1-SNAPSHOT.jar > /dev/null 2>&1  &
    
  2. 制作服务文件

这里的启动顺序10

#chkconfig:2345 10 90
#description:${serviceName} service
export JAVA_HOME=/opt/jdk8
export PATH=$JAVA_HOME/bin/:$PATH
sh {$yourdir}/start.sh

windows部署

windows下设置系统服务则比较方便。

使用nssm工具

  1. 进入nssm.exe所在路径,执行下图所示命令 ```java //service-name,具体的服务名 //node.exe,具体可执行文件,注意要绝对路径 nssm install service-name d://node.exe d://app.js

//手动选择执行的exe和输入参数 nssm install service-name


2. 启动服务
```shell
nssm start service-name
  1. 停止服务

    nssm stop service-name
    
  2. 卸载服务

    nssm remove service-name confirm
    
  3. 编辑服务

    nssm edit service-name