自定义配置需要修改:
脚本名称 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