您当前的位置: 首页 > 

彭世瑜

暂无认证

  • 2浏览

    0关注

    2791博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

shell脚本控制程序启动停止重启

彭世瑜 发布时间:2019-11-06 12:15:51 ,浏览量:2

自定义配置需要修改:

脚本名称 process_name
启动命令函数 function start
停止命令函数 function stop 正常不需要修改

run_spider.sh

#!/bin/bash

# 配置要启动关闭的脚本名
process_name="run_spider.py"

# 添加启动命令
function start(){
    echo "start..."

    nohup python3 $process_name 2>&1 &

    echo "start successful"
    return 0
}

# 添加停止命令
function stop(){
    echo "stop..."

    ps aux |grep $process_name |grep -v grep |awk '{print "kill -9 " $2}'|sh

    echo "stop successful"
    return 0
}

case $1 in
"start")
    start
    ;;
"stop")
    stop
    ;;
"restart")
    stop && start
    ;;
*)
    echo "请输入: start, stop, restart"
    ;;
esac

控制脚本

$ bash run_spider.sh
请输入: start, stop, restart

$ bash run_spider.sh start
$ bash run_spider.sh stop
$ bash run_spider.sh restart
升级版本

使用pid控制进程

$! 上一个后台进程的 pid

#!/bin/bash
# service.sh

# 启动命令
function start(){
    if [ -e 'run.pid' ]
    then
        echo "run.pid exists"
    else
        echo "start..."

        nohup go run main.go > logger.log 2>&1 & echo $! > run.pid

        echo "start successful"
    fi

    return 0
}

# 停止命令
function stop(){
    if [ ! -e 'run.pid' ]
    then
        echo "run.pid not exists"
    else
        echo "stop..."

        # ps aux |grep $process_name |grep -v grep |awk '{print "kill -9 " $2}'|sh
        kill `cat run.pid`
        rm -rf run.pid
        
        echo "stop successful"
    fi
    return 0
}

# 帮助
function help(){
    echo "请输入: start,stop,restart"
    return 0
}

case $1 in
"start")
    start
    ;;
"stop")
    stop
    ;;
"restart")
    stop && start
    ;;
"help")
    help
    ;;
*)
    help
    ;;
esac

可以配置Makefile使用,来简化命令

# 启动测试环境
.PHONY: dev
dev:
	go run main.go

# 后台启动
.PHONY: start
start:
	bash service.sh start

# 结束
.PHONY: stop
stop:
	bash service.sh stop

# 结束
.PHONY: restart
restart:
	bash service.sh restart

使用的main.go

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	app := gin.Default()

	app.GET("/", func(ctx *gin.Context) {
		ctx.String(http.StatusOK, "hello")
	})

	// 监听并在 http://127.0.0.1:8080 上启动服务
	app.Run()
}

http://localhost:8080/

查看进程

ps aux|grep main.go

# 或者
ps aux|grep main.go | grep -v grep

解除端口占用

# 查看占用端口的进程
lsof -i:8080

# 方式一
lsof -i:8080 | grep -v PID | awk '{print "kill -9 " $2}' | sh

# 方式二
kill -9 `lsof -t -i:8080`

查看子进程

# macOS
$ brew install  pstre

$ pstree -p 74396

遗留问题:

主进程结束之后,还有一个子进程在监听端口,没有结束

参考 linux命令(26):Bash Shell 获取进程 PID 使用nohup后台运行并获取pid

关注
打赏
1665367115
查看更多评论
立即登录/注册

微信扫码登录

0.1372s