如何编写linux的启动脚本

如何编写linux的启动脚本


linux下shell脚本

了解linux shell

shell是系统的用户界面,提供了用户与内核进行的交互操作的一种接口;它接收用户输入的命令并把它送到内核去执行。

Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

Linux提供了像MicrosoftWindows那样的可视的命令输入界面–X Window的图形用户界面(GUI)。它提供了很多桌面环境系统,其操作就像Windows一样,有窗口、图标和菜单,所有的管理都是通过鼠标控制。GNOME。
每个Linux系统的用户可以拥有他自己的用户界面或Shell,用以满足他们自己专门的Shell需要。

shell中的变量定义和引用

  1. 变量定义和初始化。shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言;变量没有明确类型就是弱类型语言),和C语言不同。在shell编程中定义变量不需要制定类型,也没有类型这个概念。

  2. 变量定义时可以初始化,使用=进行初始化赋值。在shell中赋值的=两边是不能有空格的。

    注意:shell对语法非常在意,非常严格。很多地方空格都是必须没有或者必须有,而且不能随意有没有空格。

  3. 变量赋值,变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给他赋值时的值。

  4. 变量引用。shell中引用一个变量必须使用 符号, 符号就是变量解引用符号。
    注意: s h e l l 符号后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会报错,而是把这个变量解析为空。也就是说在shell中没有被定义的变量其实就相当于是一个定义并赋值为空的变量。 注意:变量引用的时候可以 var,也可以 v a r {var}。这两种的区别是在某些情况下只能用 {var}而不能简单的$var

shell中调用linux命令

  1. 直接执行;

  2. 反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令。

    PWD=pwd
    echo $PWD

    MYPATH="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= 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的创建和追加输入文件

  1. 在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中。创建文件并输入内容的关键就是>
  2. 还可以使用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、 ?、 ! !、 *、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" … " n” 的形式输出所有参数。
@ @ 跟 *类似,但是可以当作数组用

$#

添加到Shell的参数个数
$0

Shell本身的文件名

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等等

以上配置解释

  1. 代表用bash去执行shell command line
    2.代表crontab 默认的环境变量
    3.crontab每执行一个任务都会给系统root用户发送一个邮件

  2. 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

发布了30 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/wg22222222/article/details/89234804