1、shell 基本语法
1.1、什么是shell?
Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。这种对话方式可是交互也可以是非交互式的
我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们
常见的shell解释器程序有很多种,使用不同的shell解释器时,其内部命令、命令行提示符等方面会存在一些区别。通过/etc/shells文件可以知道当前系统所支持的shell种类。其中/bin/bash是目前大多数linux版本采用的默认shell。
1.2、 什么是SHELL脚本?
Shell脚本(shell script)就是将要执行的命令按顺序保存到一个文本文件,并给该文件可执行权限,方便一次性执行的一个程序文件。主要是方便管理员进行设置或管理,可结合各种shell控制语句以完成更复杂的操作。常用于重复性操作、批量事物处理、自动化运维、服务运行状态监控、定时任务执行等。
date;who
Tue Jan 16 20:37:31 CST 2018
root pts/0 2018-01-16 19:33 (10.10.30.1)
创建一个shell脚本文件
附加知识:
date命令:
命令功能:date 可以用来显示或设定系统的日期与时间。
显示时间:
date命令可以按照指定格式显示日期,只键入date则以默认格式显示当前时间。如下:
# date
Sat Jun 15 16:51:13 CST 2019
如果需要以指定的格式显示日期,可以使用“+”开头的字符串指定其格式,详细格式如下:
%n : 下一行(即a newline)
%t : 跳格(即一个tab)
%H : 小时(00-23)
%I (大写i): 小时(01-12)
%k : 小时(0-23)
%l (小写L): 小时(1-12)
%M : 分钟(00-59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S : 秒(00-60)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区
%a : 星期几 (Sun-Sat)
%A : 星期几 (Sunday-Saturday)
%b : 月份 (Jan-Dec)
%B : 月份 (January-December)
%c : 直接显示日期与时间
%d : 日 (01-31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001-366)
%m : 月份 (01-12)
%U : 一年中的第几周 (00-53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0-6)
%W : 一年中的第几周 (00-53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000-9999)
上述格式不必全都记住,只需要掌握几个常用的即可。例如%Y表示年,%m表示月,%d表示日,%H表示小时,%M表示分钟,%S表示秒,%s表示从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数, %w表示一周中的第几天。
实例见下:
# date "+now time is: %Y-%m-%d %H:%M:%S"
now time is: 2019-06-15 17:05:41
# date "+%Y-%m-%d %H:%M:%S"
2019-06-15 17:05:57
# date -I //大写i
2019-06-15
设定时间:
date -s 01:01:01 #设置具体时间,不会对日期做更改
date -s "01:01:01 2019-06-15" #这样可以设置全部时间
date -s "01:01:01 20190615" #这样可以设置全部时间
date -s "2019-06-15 01:01:01" #这样可以设置全部时间
date -s "20190615 01:01:01" #这样可以设置全部时间
注意,生产环境中,要确保服务器的系统时间是一致的,可以通过NTP(网络时间协议,基于udp 端口使123)服务同步时间,确保所有服务器的时间一致。可以自己搭建NTP时间服务器,也可以使用internet提供的NTP服务器。
例如结合cron计划任务定期与internet提供的ntp服务器同步保持时间一致。
# crontab -l
1 3 * * * /sbin/ntpdate 1.cn.pool.ntp.org
注:ntpdate命令是网络时间同步命令。
1.3、 命令解释器
1.3.1、 shell脚本格式:
SHELL脚本的第一行以 #! ,后面的路径名称是命令解释器。#!/bin/bash 作用:告诉脚本使用的是哪种命令解释器,此行以后的语句通过/bin/bash程序来解释执行。如不指shell,以当前shell作为执行的shell。大多数情况下,脚本的开头使用“#!/bin/bash”和“#!/bin/sh”, sh为bash的软链接。
在shell中以#开始头表示整个行就被当作一个注释。执行时被忽略。
shell程序一般以.sh结尾,当然主要是看是否为执行,然后看里面有没有#!
例如:执行以下操作可以创建一个脚本文件:
[root@localhost ~]# vim test.sh
注:nmap是linux下的网络扫描和嗅探工具(需要安装nmap软件包)
# nmap -n 192.168.30.11 //-n 不使用dns解析
1.3.2、 脚本执行方式:
1.3.2.1、 通过命令解释器执行脚本:bash test.sh 或 sh test.sh
(可以对脚本文件不添加执行权限)
这时当脚本文件本身没有可执行权限(即文件权限属性x位为-号)时常使用的方法,或者脚本文件开头没有指定解释器时需要使用的方法。
1.3.2.2、 路径下执行脚本
/root/test.sh 或 ./test.sh (当前路径下执行脚本,文件要有执行权限的)
指在当前路径下执行脚本(脚本需要有执行权限),需要将脚本文件的权限改为可执行(即文件权限属性为x位)。具体方法为:chmod a+x script-name。然后通过执行脚本绝对路径或者相对路径就可以执行脚本了。
注意:在生产环境中,运维人员由于忘记为该脚本设置可执行权限,然后直接使用,导致出错。因此,推荐第一种 bash script-name。
1.3.2.3、 source script-name或 . script-name
source或者“.”命令的功能是:读入脚本并执行脚本,即在当前Shell中执行source或“.”加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令。
注意:这是和其他几种执行shell方式的最大不同。
(脚本文件可以没有执行权限)
1.3.2.4、 sh < test.sh 或 cat test.sh | sh (脚本可以不加执行权限)
1.3.3、 创建shell脚本的步骤
1、写脚本(包含基本的命令和控制语句等)
2、检测语法错误
3、添加执行权限
4、执行
1.4、 管道与重定向
1、管道操作
管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象)。同一行命令中可以使用多个管道,使用格式如下所示:
cmd1命令|cmd2命令[…|cmdn命令]
例1:#grep -v “^#” /etc/sshd_config | grep -v “^$”
例2:若要提取根分区(/)的磁盘使用率信息,可以执行以下操作,其中用到了df、grep、awk命令和管道操作。
提取之前:
提取之后,其中grep “/$”表示提取以“/”结尾的行。awk命令的作用是以空格作为分隔,输出第6个区域的信息。
2、重定向操作
Linux系统使用文件来描述各种硬件、设备资源,如以前学过的硬盘和分区、光盘等设备文件。用户通过操作系统处理信息的过程中,包括以下几类交互设备文件。
标准输入(STDIN):默认的设备是键盘,文件编号为0,命令将从标准输入中读取在执行过程中需要的输入数据。例如通过passwd设置用户密码操作
标准输出(STDOUT):默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到显示器。
标准错误(STDERR):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到显示器。
在实际的Linux系统维护中,可以改变输入、输出内容的方向,而不是用默认的标准输入、输出设备(键盘和显示器),这种操作称为“重定向”。
(1)重定向输入
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“<”操作符。
例如:使用passwd命令为用户设置密码时,每次都根据提示输入两次密码字串,非常繁琐,若改用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合passwd命令的—stdin选项来识别标准输入)。
注意:关闭selinux
没有交互式的操作,语句更方便在shell脚本程序中使用,可以大大减少程序被打断的过程,提供脚本执行的效率。
(2)重定向输出
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上,重定向输出使用“>”或“>>”操作符号,分别用于将前面的命令的输出结果保存到该文件中;若目标文件已存在,则将输出结果覆盖或追加到文件中。
例如:将当前主机的CPU信息(uname -p)保存到kernel.txt文件中,而不是直接显示在屏幕上,可以执行以下操作。
当需要保留目标文件原有的内容时,应该为“>>”操作符,以便追加内容而不是覆盖。例如以下操作可以将内核版本信息追加到kernel.txt文件中。
(3)错误重定向
错误重定向指的是将执行命令过程中出现的错误信息保存到指定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”或“2>>”操作符,其中2是指错误文件的编号(在使用标准输出、输入重定向时,实际上是省略了1、0编号)。
在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据,对于shell脚本,还可以将无关紧要的错误信息重定向到空文件/dev/null中,以保持脚本输出的简洁。
例如:执行以下操作可以将使用tar命令进行备份时出现的错误信息保存到error.log文件中。
使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,应改为用“2>>”操作符。
当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可以使用操作符“>”“>>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类输出信息保存到同一个文件。
例如:在编译源码包的自动化脚本中,若要忽略make、make install等操作过程的信息,可以将其定向到空文件/dev/null。
在脚本文件中重定向标准输出和标准错误到同一个文件除了&>外,也可以使用"exec >log.txt 2>&1" 命令。
重定向和管道符是shell环境中十分常用的功能,若能熟练掌握并灵活运用,将有助于编写简洁但功能强大的shell脚本程序。
2、SHELL变量及运用
2.1、 shell变量
2.1.1、 变量的解释:
变量是shell 传递数据的一种方法。变量是用来代表每个值的符号名。我们可以把变量当成一个容器,脚本可以在内存中存储数据,然后通过变量。就可以在脚本执行中进行修改和访问存储的数据。
2.1.2、 变量的设置规则:
1、变量名称通常是大写字母,它可以由数字、字母(大小写)和下划线_组成。变量名区分大小写;但是大家要注意变量名称不能以数字开头
2、等号 = 用于为变量分配值,在使用过程中等号两边不能有空格
3、变量存储的数据类型是整数值和字符串值
4、在对变量赋于字符串值时,建议大家用引号将其括起来,需要使用单引号或双引号。
5、要对变量进行调用,可以在变量名称前加美元符号$
6、如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。例如:
2.1.3、 BASH SHELL的扩展功能:
我们最常见的就是扩展变量值和命令替换和算术扩展
1、$name是${name}的简化版本,但是在某些情况下,还必须使用花括号引起的方式来消除歧义并避免意外的结果。例如:
# name=”Tom” //定义一个变量name,并将Tom字符串赋值给变量name
# echo ${name}Li //如果不使用花括号引起变量名会变量name和Li混淆在一起产生歧义。
2、命令的替换就是将执行某个命令的输出结果赋值给变量或作为另一个命令的处理对象(命令嵌套)。
它的使用方式:(旧形式)我们将命令括在反引号中来调用命令结果,(新形式)是使用$()语法
例1:若要提取根分区(/)的磁盘使用率信息并赋值变量
或
例2:若要查询提供ifconfig命令程序的软件包,可以执行以下操作
或
3、进行算术扩展时使用$[]或$(())进行,同时它也允许算术替换。算术扩展可以对算术表达式求值并替换成所求的值。它的格式是:
$((算术表达式))或$[算数表达式]
例如:
变量允许作为运算数
求余运算
2.1.4、 变量的分类
1、用户自定义变量
2、环境变量:这种变量中主要保存的是和系统操作环境相关的数据,例如PATH环境变量。
3、位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
4、预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
2.2、 用户定义变量
2.2.5、 变量格式:
变量名,由字母或下划线打头,不允许数字开头,后面由字母、数字或下划线组成,并且大小写字母意义不同。
变量赋值,在“=”后边直接指定变量内容是为变量赋值的最基本方法,注意,“=”两边没有空格。
在使用变量时,在变量名前加$
错误的赋值方式:
不允许以数字开头,等号两边不能有空格
对变量赋值如果字符串内容存在空格的话,用引号把它引起来
变量值的叠加,使用${}
命令的替换,使用$()或者反引号``
2.2.6、 单引号和双引号之间的区别
对变量赋值多个单词或值之间有空格,使用单引号或双引号,那么单引和双引号之间的区别
说明:
单引号(’):
当要赋值的内容中包含“$”“””“\”等具有特殊含义的字符时,应使用单引号括起来,将无法引用其他变量的值,任何字符均作为普通字符看待。即单引号之间的内容原封不动赋值给变量
双引号(”):
双引号之间的内容如有特殊符号会保留它的特殊含义
2.3、 环境变量
2.3.7、 环境变量分类:
在bash shell中,环境变量分为两类:
全局变量
局部变量
2.3.8、 定义:
全局变量对于shell和所有的子shell都是有效的
局部变量它只在当前的shell环境中有效,当进入子程序或新的子shell环境时,局部变量将无法再使用。
2.3.9、 查看全局变量
查看全局变量:env 或 printenv
2.3.10、 局部变量转化为全局变量
如果想让你的子shell继承你的局部变量,我们可以通过export把这个局部变量输出为全局变量
执行export
注:为了使用户定义的变量在所有的子shell环境中能够继续使用,可以通过内部命令export将指定的变量设置为全局变量。可以同时指定多个变量名称作为参数(不需要使用“$”符号),变量名之间以空格分隔。
使用export设置为全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值了。
例如:
2.3.11、 让变量永久生效
让变量永久生效,可以把定义好的变量写入配置文件
我们登录系统时,不同的用户会启用不同的配置文件,一般情况下有以下几个:
/etc/profile 是shell的主启动文件,只要你登录,bash会就执行这个文件,针对所有用户都生效。
$HOME/.bash_profile 作用和上面一样的,它是用户的专属配置文件
例如:
[root@localhost ~]# vim /etc/profile
配置文件生效的二种方式:
1.退出当前用户,重新进入
2.执行source命令
[root@localhost ~]# source /etc/bash_profile
2.4、 变量的删除unset
unset 变量
2.5、 设置PATH环境变量
SHELL要执行某一个程序,它要在系统中去搜索这个程序的路径
PATH变量是用来定义命令和程序搜索路径的,当仅指定文件名称来执行命令程序时,linux系统将在PATH变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”。当我们安装了第三方程序后,可以把第三方程序bin目录添加到这个PATH路径内,就可以在全局调用这个第三方程序的。
例如下面的例子:
其他常用的环境变量:
环境变量USER表示当前登录系统的用户名称
环境变量HOME表示用户的宿主目录
环境变量LANG表示语言和字符集
环境变量PWD表示当前所在的工作目录。
2.6、 位置变量
Shell解释执行用户的命令时,将命令行的第一个字作为命令名,而其它字作为参数。由出现在命令行上的位置确定的参数称为位置参数。
使用$N 来表示
$0 获取当前执行shell脚本或程序的名称,包括脚本路径,命令本身。注意:$0属于预定义变量而不是位置变量。
$n 获取当前脚本的第n个参数 n=1,2.....n 当n大于9时 用${10}表示。
例1:
[root@localhost ~]# cat test2.sh
#!/bin/bash
echo "执行的程序或脚本名称:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
echo "第四个参数:$4"
[root@localhost ~]# sh test2.sh ni hao world 55
执行的文件名字:test2.sh
第一个参数:ni
第二个参数:hao
第三个参数:world
第四个参数:55
例2:编写一个加法运算的脚本adder2num.sh,用来计算两个整数的和。需要计算的两个整数在执行脚本时以位置变量的形式提供。
2.7、 特殊变量
2.7.12、 预定义变量
有些变量是一开始执行Script脚本时就会设定,且不能被修改,我们叫他们为预定义变量。这些变量当一执行程序时就有了,以下是一些预定义变量:
$* |
表示所有位置参数的内容,即以一个字符串显示所有向脚本传递的参数; $*以"$1 $2 … $n"的形式输出所有参数 |
$# |
表示命令行中位置参数的个数,传递到脚本的参数个数 |
$@ |
与$*相同 $@以"$1" "$2" … "$n" 的形式输出所有参数 |
$$ |
当前进程的进程号PID |
$? |
显示上一条命令的退出状态;0表示没有错误,其他任何值表明有错误 |
$! |
后台运行的最后一个进程的进程号pid |
例子:
[root@localhost ~]# cat test3.sh
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7
echo "脚本的名字 $0"
echo "当前参数的个数为: $#"
echo "参数列表一: $*"
echo "参数列表二: $@"
echo "上条命令的执行结果:$?"
[root@localhost ~]# sh test3.sh a b c d e
a b c d e
脚本的名字 test3.sh
当前参数的个数为: 5
参数列表一: a b c d e
参数列表二: a b c d e
上条命令的执行结果:0
2.7.13、 $* 与 $@ 区别
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * "等价于 "1 2 3"(传递了一个参数,保持一个整体),而 "@" 等价于 "1" "2" "3"(传递了三个参数,分开)
例子:
[root@localhost ~]# cat test4.sh
#!/bin/bash
echo "-----\$*-----"
for i in "$*";do
echo $i
done
echo "----\$@-----"
for i in "$@";do
echo $i
done
说明:echo "----\$@-----"中的“\”是转义符,跟在\后的特殊符号将失去特殊含义,变为普通字符,如\$@将输出$@符号,而不当做预定义变量。
[root@localhost ~]# sh test4.sh a b c
-----$*-----
a b c
----$@-----
a
b
c
3、数学运算
3.1、 expr命令
3.1.1、 对数字的基本计算
expr只能进行简单的整数运算,不支持小数运算,运算符和运算数之间至少要有一个空格。
注:做数字大小比较时,输出结果假为0,1为真;特殊符号用转义符
需要注意的是乘法运算,不能仅使用“*”符号,否则将被当成文件的通配符。需要用转义符“\”进行转义。以上操作也可以使用变量,如:
x=2
y=5
z=$(expr $x + $y)
用在脚本中,可以如下这样:
3.1.2、 对字符串处理
详细资料可以查看expr的man手册页
3.2、 使用双括号(( ))
除了expr命令之外,数值运算的常见命令还包括:$(())、let等。如果要执行简单的整数运算,只需要将特定的算数表达式用$(())括起来即可。
3.2.3、 格式:$((表达式1,表达式2))
3.2.4、 特点:
1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。a++ 等价于 a=a+1
2、在双括号结构中,所有变量可以不加入:“$”符号前缀。(当然变量名前也可以$)
3、双括号可以进行逻辑运算,四则运算
4、双括号结构 扩展了for,while,if条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开
常用的算数运算符
运算符 |
意义 |
++ -- |
递增及递减,可前置也可以后置。如a++、++a |
+ - * / % |
加减乘除与余数 |
< <= > >= |
比较大小符号 |
== != |
相等 不相等 |
&& || ! |
逻辑与 ,逻辑或,逻辑否 |
? : |
条件判断 |
= += -= *= /= %= |
赋值运算符,a+=1相当于a=a+1 |
加减乘除运算:
变量允许作为运算数
递增和递减:
说明: a++先读取a的值,然后在累加1
++a先累加1,然后再读取a的值
[root@localhost ~]# echo $B
11
[root@localhost ~]# echo $((B++))
11
[root@localhost ~]# echo $((B++))
12
[root@localhost ~]# echo $((B++))
13
[root@localhost ~]# echo $((B++))
14
[root@localhost ~]# echo $B
15
[root@localhost ~]# echo $((++B))
16
[root@localhost ~]# echo $((++B))
17
[root@localhost ~]# echo $((++B))
18
数字大小的比较:
数字大小的比较,真为1,假0
求余运算:
[root@localhost ~]# x=17
[root@localhost ~]# y=2
[root@localhost ~]# z=$((x%y))
[root@localhost ~]# echo $z
1
条件判断:
条件判断的格式:条件?值1:值2 表示条件成立返回值1,否则返回值2
例如:
[root@localhost ~]# z=$((3>6?1:4))
[root@localhost ~]# echo $z
4
3.3、 使用方括号[ ]
3.4、 浮点运算 bc
3.4.5、 bc是一个工具
输入quit退出
3.4.6、 在脚本中使用bc
脚本应用:
编写运行状况监控脚本/opt/monitor.sh,用于记录CPU负载、内存和交换空间、磁盘空间、最近的用户登录情况等信息,以及当时的时间信息。
用vim命令在/opt目录是新建一个脚本文件monitor.sh,内容如下:
#!/bin/bash
mkdir -p /var/log/runrec
RecFile="/var/log/runrec/running.today"
RecTime=$(date +"%Y-%m-%d %H:%M")
LoadRec=$(uptime)
MemRec=$(free -m)
DiskRec=$(df -hT)
LastLoginRec=$(last -n 20)
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Record Time: $RecTime
cpu Load information:$LoadRec
Memory information:$MemRec
Disk Usage information:$DiskRec
Last login 20 users record:$LastLoginRec" >> $RecFile
写完脚本后,建议在运行脚本之前先检查脚本中的语法,而不是查看它们的输出以确认它们是否正常工作。
shell调试选项:
一些常用选项的用法:
-n 只读取shell脚本,但不实际执行
-x 进入跟踪方式,显示所执行的每一条命令
-v 一边执行脚本,一边将执行过的脚本命令打印到标准输出,如果有错误,会给出错误提示。
“-n”可用于测试shell脚本是否存在语法错误,但不会实际执行命令,如果没有语法问题就不显示任何内容,如果有问题会提示报错。在shell脚本编写完成之后,实际执行之前,首先使用“-n”选项来测试脚本是否存在语法错误。因为某些shell脚本在执行时会对系统环境产生影响,比如生成或移动文件等,如果在实际执行才发现语法错误,您不得不手工做一些系统环境的恢复工作才能继续测试这个脚本。
"-x"选项可用来跟踪脚本的执行,是调试shell脚本的强有力工具。“-x”选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来(用于跟踪逻辑),并且在行首显示一个"+"号。 "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。 “-x”选项使用起来简单方便,可以轻松对付大多数的shell调试任务,应把其当作首选的调试手段。
使用这些选项有三种方法
1.在命令行提供参数:#sh -x script.sh
2.脚本开头提供参数:#!/bin/sh -x
3.在脚本中用set命令启用or禁用参数:其中set -x表启用,set +x表禁用。注意避免几种调试选项混用。
测试脚本能正常运行及输出正确信息后,赋予执行权限,设定计划任务(如果需要),要求每隔15分钟执一次monitor.sh脚本,并确认crond服务已启动。
使用chmod命令给monitor.sh文件增加执行(x)权限
创建计划任务:
#crontab –e 内容如下
*/15 * * * * /opt/monitor.sh