linuxinit.dshell脚本编写学习记录
以python程序为例,在linux运⾏中⽅式为python xxx.py
假如我们这个程序有⼀个循环,那当我们python xxx.py程序以后将⽆法再在这个界⾯进⼊到linux指令中,那么能否让linux后台去运⾏这个程序,⽽我们仍然切换回linux的指令框,去做⼀些别的事情,在wiondws中就相当于将程序最⼩化了,⽽程序仍在运⾏,不耽误我们做别的事。
这⾥我采⽤linux init.d⽬录来进⾏管理linuxshell脚本怎么运行
1.init.d
这个可以百度搜索⼀下,我这⾥的理解是linux底层会将这个⽬录中的脚本给封装为后台启动的⽅式,使⽤service *(filename) *command 的⽅式来启动,这条命令中,service是第⼀个指令,它是linux底层封装好的,⼀个全局的命令,代表了我们要读取init.d中的filename来作为服务,filename就是我们⾃⼰创建的⽂件名,comman是我们⾃⼰设计的指令,通过接收这些指令我们可以运⾏我们服务中的函数,来确保达到我们想要的效果。
2.shell语法问题
在shell中有两个特殊的符号,有很多神奇的作⽤,1个是数字键4上⾯的$
1个是数字键7上⾯的&
因为在贴吧不适合打符号,接下来⽤4上⾯代表
4上⾯符号,⼤部分时候⽤来取值
7上⾯符号,放在指令结尾,可以让其后台进程执⾏
1)变量命名
和⼤多数语⾔差不多,使⽤变量=值的⽅式。
但是要注意,变量=值,这个语句中是不可以出现空格的,在shell中,除了某些特殊指令,⼤部分指令会以空格来分隔,也就是说,如果你在赋值过程中。加⼊了空格,那么shell不会识别它是赋值语句,⽽认为它是要执⾏指令,接着就会提⽰你command notfound
2)echo
echo xxxx
打印输⼊的指令,会打印 后⾯的内容
3)变量引⽤
在shell中,我们之前赋值好的变量,之后要使⽤的话,需要给前⾯加上$符号
3.shell函数
可以使⽤function XXX(){}的使⽤⽅式,也可以直接使⽤xxx(){}的⽅式
但是函数名后⾯⼀定要跟着(){},如果你这个函数需求参数,那么使⽤function xxx(){}的⽅式,xxx(){}只⽀持⽆传参的⽅式。
if语句,if语句要以,then为下⼀条指令,并要以fi来结尾,
举例:if[true];then echo 1;fi
这⾥⾯的;不是必须的,但是⼀旦这些语句出现在同⼀⾏,那么必须以;来隔开
中间可以出现else,elif,但是必须以fi来结尾。
if|elif|else—fi
if[]后⾯如果跟着⼀个中括号【】,那么这个【】内就是判断条件。
case是⼀个特殊函数,case后⾯所执⾏的每个指令都要以;;来结尾
4.shell⼀些独特点
if的条件判断特殊参数
-n variable: 判断变量是否为空,为空则false,⾮空则True
-d :判断是否是⽬录
-f :判断是否是⽂件
-e:⽂件名如果存在为真
! 为取反, [! -n 空] == True
$0,$1,$2等等,表⽰传参,例如我们在linux系统输⼊ service *filename *command
filename就是$0,command就是$1
5.⼀个init.d⽬录中,⾃⼰书写的shell实例
我们的shell脚本思想是通过查询我们进程的id,来判断是否存在此进程,存在做什么,不存在做什么。
然后通过$2接收我们的command,决定使⽤哪个函数。
#!bin/bash
process="CrossServerApp"
#启动服务⽅法
start(){
mypid=$(ps -e|grep $process|awk'{print $1}')
if[! -n "$mypid"];then
echo"CrossServerApp Process "
else
echo"CrossServerApp "
su root -c "python /var/www/CrossServer/CrossServerApp.py &"
sleep 0.5
fi
}
stop(){
mypid=$(ps -e|grep $process|awk'{print $1}')
if[! -n "$mypid"];then
echo"Can't Find "
else
echo"  pid: $mypid"
kill -9 $mypid
fi
}
#查看服务状态
status(){
if[ -e $process];then
echo"$0 service start"
else
echo"$0 service stop"
fi
}
#重新启动
restart(){
stop
sleep 2
start
}
case"$1"in
start)
start
;;
stop)
stop
;
;
status)
status
;;
restart)
restart
;;
*)
echo"$0 start|stop|status|restart"
exit 1
esac
需要实际注意三个点,
1,process="CrossServerApp"这⾥的process赋值我们实际要启动的进程名。
2,ps -e|grep $process|awk ‘{print $1}’ 这是⼀条可以通过进程名查询到进程ID的指令3,脚本末有个exit 1,没搞懂实际⽤处,但是不写的话,会返还语法错误。。
最后还有⼀点,记得给shell脚本命名并放在/etc/init.d/⽬录下,这个是centos的,接着chmod +x *********给脚本增加执⾏权限,
如果要加⾃启动可以百度⼀下。
最后试运⾏ service *filename *command