centos 自定义服务,实现.net core脱离supervisor的进程守护,同时实现start,stop等指令控制

场景:

  本人一直用.net core和supervisor做进程守护(deamon),但是感觉还是mysql这种服务做得好,可以通过start.stop等指令实现控制启停。其实这里用的就是liunx自带的service

解决:

  在/etc/init.d下建立自己的service,注意不能有后缀名:

vi /etc/init.d/bigdata

  在该文件中写如下代码:

#! /bin/bash
#chkconfig: 35 96 10
#description: big data

NAME=bigdata
PIDFILE=/var/run/$NAME.pid
source /etc/init.d/functions

case $1 in
start)
        # 获取pid
        pid=0;
        echo "$pid"
        # 简单的进程守护
        pid=`ps -aux | grep 'XXXX' | grep -v 'grep' | awk '{print$2}'`
        echo "第二次pid:$pid"
        if  [[ $pid > 0 ]]; then
            action "bigdata already started";
        else
            nohup /root/bigdata-1.0.0/MY.sh &
            action "bigdata is starting";
        fi
        # 沉睡5s


        ;;
stop)
        spid=0;
        echo "$spid"
        # 获取pid
        spid=`ps -aux | grep 'XXXX' | grep -v 'grep' | awk '{print$2}'`
        echo "第二次pid:$spid"
        if [[ $spid > 0 ]]; then
            sh /root/bidata-1.0.0/Stop.sh
            echo "bigdata is stopping";
        else
            echo "bigdata is stopped";
        fi
        ;;
restart)
        start
        stop
        ;;
init)
     # 这里我是通过发起http请求来实现本地的初始化的,这样方便后端实现逻辑 # 10s内输入参数name read -t 10 -p "请输入要初始化的数据库" name curl -v "http://127.0.0.1:1808/api/v1/Auth/Init?name=$name" ;; active) read -t 10 -p "请输入密钥:" key curl -v "http://127.0.0.1:1808/api/v1/Auth/Active?key=$key" ;; status) spid=`ps -aux | grep 'XXXX' | grep -v 'grep' | awk '{print$2}'` if [[ $spid > 0 ]]; then action "运行中..." else action "未启动" fi ;; *) echo "Usage:service bigdata start|stop|restart|init|active|status " ;; esac

  其中的MY.sh内容如下,就是启动一个dotnet应用(这里可以写一个死循环,一直监听该进程是否启动,不启动就启动它,从而实现一个简单低效的进程守护):

#!/bin/bash
cd /root/bigdata-1.0.0/
dotnet XXXX.dll

  其中的Stop.sh如下:

#!/bin/bash
spid=0;
echo "$spid"
# 获取pid
spid=`ps -aux | grep 'XXXX' | grep -v 'grep' | awk '{print$2}'`
echo "第二次pid:$spid"
if [[ $spid > 0 ]]; then
   kill -9 $spid
   echo "bigdata service is stopping";
else
   echo "bigdata is stopped";
fi
pid=`ps -aux | grep 'MY.sh' | grep -v 'grep' | awk '{print$2}'`
echo "sh的pid:$pid"
if [[ $pid > 0 ]]; then
   kill -9 $pid
   echo "sh is stopping";
else
   echo "sh is stopped";
fi

  

  解释一下主要的参数:

source : 该脚本要用的函数的来源,相当于指定头文件。其中的action文件就是一个控制台输出的函数,可以到/etc/init.d/functions下查看各个函数。
case : 根据脚本的第一个变量判断进行哪个函数,$1是shell指定的变量,有以下几种:

  $0 脚本名

  $1 脚本后的第一个字符串

  $2 脚本后的第二个字符串

  $# 脚本后字符串个数

  $* 脚本后的字符串集整体

  $@ 脚本后的字符串集

  $? 命令执行完的返回值

 

  然后解释一下脚本中的语句:

# 定义一个编排spid,这个变量的值是通过后面的command语句的结果进行赋值的。
# 后面的语句是根据名称查询进程的pid值
spid=`ps -aux | grep 'XXXX' | grep -v 'grep' | awk '{print$2}'`
# 10s内监听控制台输入,并赋值给name变量
read -t 10 -p "请输入要初始化的数据库" name
# 通过curl方法发出一个http的Get请求,当然也可以是post
curl -v "http://127.0.0.1:1808/api/v1/Auth/Active?key=$key"
# 通过nohup的方式来运行sh脚本,并使它不中断的运行在后台(不然.net core启动的打印信息会打印出来)
# 注意,这种方式启动的进程,需要通过ps -aux查询该sh进程,并用kill -9杀掉
nohup /root/bigdata-1.0.0/MY.sh &

   本人也是liunx小白,希望能多学习一下。

参考:

  https://blog.csdn.net/weixin_42358173/article/details/116629140?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.queryctrv2&spm=1001.2101.3001.4242.2&utm_relevant_index=4

  http://www.178linux.com/98053

  https://blog.csdn.net/zhandar44/article/details/91366447

上一篇:CentOS安装node8.x版本


下一篇:CentOS 7 出现 command not find 问题原因分析及解决方法