场景:
本人一直用.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