#!/bin/bash
pid=$(ps -ef | grep “/root/memeplatform/ENV/bin/python meme/manage.py runserver” | grep -v “grep” | awk ‘{print $2}’)
notice(){
echo “用法:$0 {start|stop|restart}”
}
start() {
sleep 2
pids=$(ps -ef | grep “/root/memeplatform/ENV/bin/python meme/manage.py runserver” | grep -v “grep” | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲') if [ -n …{pids}" ]
then
echo “程序已经运行”
else
source /root/memeplatform/ENV/bin/activate
nohup /root/memeplatform/ENV/bin/python meme/manage.py runserver 0.0.0.0:8000 >/dev/null 2>&1 &
a=$?
sleep 3
if [ ${a} -eq 0 ]
then
echo “程序启动成功”
else
echo “程序启动失败”
fi
deactivate
fi
exit
}
stop() {
if [ -n “${pid}” ]
then
kill ${pid}
if [ $? -eq 0 ]
then
echo “程序已停止”
else
kill -9 ${pid}
if [ $? -eq 0 ]
then
echo “程序已停止”
else
echo “程序停止失败”
fi
fi
else
echo “程序没有运行”
fi
}
restart() {
stop
start
}
if [ $# -eq 1 ];then
case $1 in
“start”)
start
;;
“stop”)
stop
;;
“restart”)
stop
start
;;
*)
notice
;;
esac
else
notice
fi
这个启动脚本是一个shell脚本,我用它来启动我的django项目(测试平台:react+django)后面会详细分享。看之前,希望大家可以熟悉一些shell脚本的基础用法,不然个别语法可能不理解,我会一行一行代码解释其意思
首先,我们先明白这一段脚本的用法,也是到底是干什么的?
我们看到上面有几个函数:notice()、start()、stop()、restart(),下面有一个if判断。其实就是我们输入命令参数,if去判断我们输入的命令参数,去调用相对应的函数,是notice(信息警告)、是start(启动)、是stop(停止)、还是restart(重启),函数里面写了一些Linux的命令,来控制我们的项目。
notice函数:信息警告,当你输入命令不对时,就会调用这个函数
代码:echo “用法:$0 {start|stop|restart}”
解释:echo:输出 $0 :为执行的文件名,我现在调用一下notice函数看看
start函数:当时输入开始命令时(sh run.sh start),就会调用开始函数,进行项目的启动
代码:pids=$(ps -ef | grep “/root/memeplatform/ENV/bin/python meme/manage.py runserver” | grep -v “grep” | awk ‘{print $2}’)
解释:
ps:命令用于显示当前进程的状态
grep: 命令用于查找文件里符合条件的字符串
ps -ef | grep xx : 查找xx的进程
-v :显示不包含匹配文本的所有行
grep -v “grep”:把“grep”的信息去除,不包含“grep”信息
awk:解析文本内容
$2:表示第二个字段
print $2 : 打印第二个字段
awk ‘{print $2}’):一行一行的读取指定的文件,打印第二个字段
ps -ef | grep “/root/memeplatform/ENV/bin/python meme/manage.py runserver”
其实就是:把 "/root/memeplatform/ENV/bin/python meme/manage.py runserver"的进程查出来
ps -ef | grep “/root/memeplatform/ENV/bin/python meme/manage.py runserver” | grep -v “grep”
其实就是:把 "/root/memeplatform/ENV/bin/python meme/manage.py runserver"的进程查出来,再去除”grep“的信息
ps -ef | grep “/root/memeplatform/ENV/bin/python meme/manage.py runserver” | grep -v “grep” | awk ‘{print $2}’
其实就是:把 符合的进程号筛选出来
代码:if [ -n “${pids}” ]
解释:if [ -n str1 ]:当串的长度大于0时为真(串非空) ,代码的意思:如果pids有值,进程就开始了,没有就启动项目
代码:source /root/memeplatform/ENV/bin/activate
解释:激活虚拟环境
代码: nohup /root/memeplatform/ENV/bin/python meme/manage.py runserver 0.0.0.0:8000 >/dev/null 2>&1 &
解释: nohup /root/memeplatform/ENV/bin/python meme/manage.py runserver 0.0.0.0:8000 启动服务
/dev/null 代表空设备文件
“>” 代表重定向到哪里,例如:echo “123” > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
总体意思:标准输出和标准错误重定向到空设备文件,也就是不输出任何信息到终端
代码:a=$?
解释:显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
代码: if [ ${a} -eq 0 ]
解释:项目启动后,没有错误
deactivate:退出虚拟环境
stop函数:当时输入关闭命令时(sh run.sh stop),就会调用关闭函数,把项目的进程杀死
跟star函数类似:
if [ -n “${pid}” ]:判断进程是否存在
存在就杀死:kill ${pid}
再去判断一下,有没有杀死,没有杀死,就强制杀死: kill -9 ${pid}
再去判断:杀死了,就提示echo “程序已停止”,否则:“程序停止失败”
restart函数:是重启函数,先调用stop函数再调用star函数
最下面写一个if来对输入参数进行判断,符合下面的哪个参数就调用哪个函数功能,不符合就调用警告notice函数
先明白,shell脚本中,if的语法格式:
if condition
then
command1
command2
…
commandN
else
command
fi
这个if的条件:[ $# -eq 1 ]
$#:传递到脚本的参数个数
-eq:等于
意思:脚本传递的参数个数是1
then后面的命令体里面又嵌套了case … esac(多选择语句)
case … esac的语法格式:
case 值 in
模式1)
command1
command2
…
commandN
;;
模式2)
command1
command2
…
commandN
;;
esac
case $1 in : $1的值满足下面哪个就调用下面哪个方法
$1:表示脚本输入的第一个参数
其实就是用户输入命令,去判断用户输入是,star、stop、restart还是其他错误信息,然后去执行相应的函数,去执行函数体里面的命令,去操作Linux。
注:以上仅个人见解,如有不对,请指正,谢谢。