如何编写linux的启动脚本
如何编写linux的启动脚本
linux下shell脚本
了解linux shell
shell是系统的用户界面,提供了用户与内核进行的交互操作的一种接口;它接收用户输入的命令并把它送到内核去执行。
Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
Linux提供了像MicrosoftWindows那样的可视的命令输入界面–X Window的图形用户界面(GUI)。它提供了很多桌面环境系统,其操作就像Windows一样,有窗口、图标和菜单,所有的管理都是通过鼠标控制。GNOME。
每个Linux系统的用户可以拥有他自己的用户界面或Shell,用以满足他们自己专门的Shell需要。
shell中的变量定义和引用
-
变量定义和初始化。shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言;变量没有明确类型就是弱类型语言),和C语言不同。在shell编程中定义变量不需要制定类型,也没有类型这个概念。
-
变量定义时可以初始化,使用=进行初始化赋值。在shell中赋值的=两边是不能有空格的。
注意:shell对语法非常在意,非常严格。很多地方空格都是必须没有或者必须有,而且不能随意有没有空格。
-
变量赋值,变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给他赋值时的值。
-
变量引用。shell中引用一个变量必须使用 符 号 , 符号, 符号,符号就是变量解引用符号。
注意: 符 号 后 面 跟 一 个 字 符 串 , 这 个 字 符 串 就 会 被 当 作 变 量 去 解 析 。 如 果 这 个 字 符 串 本 身 没 有 定 义 , 执 行 时 并 不 会 报 错 , 而 是 把 这 个 变 量 解 析 为 空 。 也 就 是 说 在 s h e l l 中 没 有 被 定 义 的 变 量 其 实 就 相 当 于 是 一 个 定 义 并 赋 值 为 空 的 变 量 。 注 意 : 变 量 引 用 的 时 候 可 以 符号后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会报错,而是把这个变量解析为空。也就是说在shell中没有被定义的变量其实就相当于是一个定义并赋值为空的变量。 注意:变量引用的时候可以 符号后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会报错,而是把这个变量解析为空。也就是说在shell中没有被定义的变量其实就相当于是一个定义并赋值为空的变量。注意:变量引用的时候可以var,也可以 v a r 。 这 两 种 的 区 别 是 在 某 些 情 况 下 只 能 用 {var}。这两种的区别是在某些情况下只能用 var。这两种的区别是在某些情况下只能用{var}而不能简单的$var
shell中调用linux命令
-
直接执行;
-
反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令。
PWD=
pwd
echo $PWDMYPATH="
pwd
\include"
MYPATH1=’pwd
\include’
echo “MYPATH= M Y P A T H " e c h o " M Y P A T H 1 = MYPATH" echo "MYPATH1= MYPATH"echo"MYPATH1=MYPATH1”
shell中的选择分支结构
典型if语言格式
if [表达式]; then
xxx
else
xxx
fi
if的典型应用
判断文件是否存在。(-f),注意[]里面前后都有空格,不能省略。
判断目录是否存在 (-d)
判断字符串是否相等(“str1” = “str2”),注意用一个等号而不是两个
判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le) 回忆一下在ARM裸机中讲述ARM汇编条件执行时,曾经用过这些条件判断的缩写。(eq就是equal,gt就是greater than,lt就是less than,ge就是greater or equal,le就是less or equal)
判断字符串是否为空(-z)注意-z判断时如果变量本身没定义也是不成立(也就是说-z认为没定义不等于为空)
if判断式中使用“-o”表示逻辑或
相当于C语言中在if后面的条件式中用逻辑与、逻辑或来连接2个式子,最终的if中是否成立取决于2个式子的逻辑运算结果
#!/bin/sh
# comment
#简写if
[ "awbc" = "abc" ] || echo "ok1"
[ "abc" = "abc" ] && echo "ok2"
#-z判断字符串是否空
str=""
if [ -z $str ]; then
echo "yes"
else
echo "no"
fi
# -eq -gt -lt -ge -le
if [ 21 -gt 2 ]; then
echo "yes"
else
echo "no"
fi
#判断字符串
str="aaboot"
if [ $str = "aboot" ]; then
echo "yes"
else
echo "no"
fi
#-o 表示逻辑或
if [ 1234 -eq 123 -o "abc4" = "abc" ]; then
echo "yes"
else
echo "no"
fi
#判断文件是否存在
#if [ -f ./dir/a.txt ]; then
#echo "yes"
#else
#test2 当前目录下 在创建dir并创建a.txt
#mkdir dir
#cd dir
#touch a.txt
#cd ..
#fi
for循环,while循环
echo的创建和追加输入文件
- 在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中。创建文件并输入内容的关键就是>
- 还可以使用echo指令配合追加符号>> 向一个已经存在的文件末尾追加输入内容。
脚本案例
在linux目录中新建run.sh脚本文件(该run.sh脚本文件放在webSpider.jar包所在目录下)
#!/bin/bash //此脚本使用/bin/bash来解释执行
. /etc/profile
. ~/.bash_profile//设置环境变量
proc_name="webSpider.jar" # 进程名
file_name="bindmonitortest.log" # 日志文件
pid=0
proc_num() # 计算进程数
{
num=`ps -ef | grep $proc_name | grep -v grep | wc -l`
return $num
}
proc_id() # 进程号
{
pid=`ps -ef | grep $proc_name | grep -v grep | awk '{print $2}'`
}
proc_num
number=$?
if [ $number -eq 0 ]# 判断进程是否存在
then
nohup java -jar webSpider.jar >webSpider.log 2>&1 &
# 重启进程的命令,请相应修改
proc_id # 获取新进程号
echo ${pid}, `date` >> $file_name # 将新进程号和重启时间记录
fi
补充说明:(1)Shell脚本中 0 、 0、 0、?、 ! 、 !、 !、 、 、 、*、KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲、@等的意义以及linux命令执行返回值意义
$$
Shell本身的PID(ProcessID,即脚本运行的当前进程ID号)
$!
Shell最后运行的后台Process的PID(后台运行的最后一个进程的进程ID号)
$?
最后运行的命令的结束代码(返回值)即执行上一个指令的返回值
$-
显示shell使用的当前选项,与set命令功能相同
$*
所有参数列表。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。
$@
所有参数列表。如"$@“用「”」括起来的情况、以"$1" “
2
"
…
"
2" … "
2"…"n” 的形式输出所有参数。
@
跟
@ 跟
@跟*类似,但是可以当作数组用
$#
添加到Shell的参数个数
$0
Shell本身的文件名
1 ~ 1~ 1~n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
####(2)#!/bin/bash 含义:
告诉操作系统, 此脚本的解释器为 /bin/bash 这个可执行文件。类似地, 如果你的脚本用 sh, ksh, 解释, 第一行就应该是#!/bin/sh,#!/bin/ksh之类的。或者, 你自己定义一种脚本语言, 再自己写个解释器去执行,比如说叫 xshell, 放在 /usr/local/bin 下, 你的脚本第一行就应该是#!/usr/local/bin/xshell
如果没有这样定义的第一行, 不同 unix 类操作系统会用默认 shell 来解释脚本, 如 unix 往往是 sh, linux 往往是用 bash, …
(3)~/.bash_profile
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
crontab 【说明:crontab 是用来让使用者在固定时间或固定间隔执行程序之用】
什么是crontab
crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
注意: 修改/etc/crontab这种方法只有root用户能用,这种方法更加方便与直接直接给其他用户设置计划任务,而且还可以指定执行shell等等
以上配置解释
-
代表用bash去执行shell command line
2.代表crontab 默认的环境变量
3.crontab每执行一个任务都会给系统root用户发送一个邮件 -
crontab配置文件
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
注意 : crontab -e这种所有用户都可以使用,普通用户也只能为自己设置计划任务
crontab文件
crontab文件包含送交cron守护进程的一系列作业和指令。每个用户可以拥有自己的crontab文件;同时,操作系统保存一个针对整个系统的crontab文件,该文件通常存放于/etc或者/etc之下的子目录中,而这个文件只能由系统管理员来修改。
crontab文件的含义
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
其中:
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
星号(*):
作用:代表任何时间都适合执行任务
解释:代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):
代表分割时间段执行任务
解释: 可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):
代表一段时间内执行任务
解释:可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
配置 crontab文件
在命令行输入: crontab -e
进行编辑:
*/1 * * * * cd /home/webSpider && ./run.sh 每隔1分钟启动run.sh脚本
10 3 * * 0,6 hello
//就是每周六、周日的3点10分执行hello程序。
15 4 * * 4-6 hello
//就是从周四到周六的4点15点执行hello程序。
注意(容易发生的问题)
1:注意环境变量问题
在编写完crontab文件的时候,改配置服务不会启动,导致该问题的原因有,run.sh脚本没有配置环境变量。
2: run.sh的脚本权限不够,可使用chmod +777 run.sh来设置权限。
3:新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
4: 尽量所有的文件都采用完全路径方式,避免使用相对路径。
常用的Linux命令:
1:查看启动状态:bin/zkServer.sh status
2:显示日期的指令: date
3:改变文件的权限:chmod
4: 复制档案或目录:cp
5: 移除档案或目录:rm
6: 移动档案与目录,或更名:mv
7: 建立新目录:mkdir
7: 删除『空』的目录:rmdir
更多推荐
所有评论(0)