shell介绍
一 、深入理解Shell
1、shell简介
shell是命令解释器(command interpreter),是Unix操作系统的用户接口,程序从用户接口得到输入信息,shell将用户程序及其输入翻译成操作系统内核(kernel)能够识别的指令,并且操作系统内核执行完将返回的输出通过shell再呈现给用户,下图所示用户、shell和操作系统的关系:
Shell就是一种命令解析器,解析用户的命令调用系统内核执行相关的命令
Shell也是一门编程语言,即shell脚本,shell是解释执行的脚本语言,可直接调用linux命令。
一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的
操作系统内核(kernel)与shell是独立的套件,而且都可被替换:
不同的操作系统使用不同的shell;
同一个kernel之上可以使用不同的shell。
常见的shell分为两大主流:
- sh :Bourns shell(sh) Solaris,hpux默认shell
Bourns again shell(bash Linux系统默认shell) - csh:C shell(csh)
TC shell(tcsh)
shell命令解析器可以解析我们输入的命令, 翻译成指令区执行
shell编程 [将用户输入的指令进行有机的集合,完成一些任务]
Shell脚本的本质,就是大量shell命令的组合,并写入一个文本文件中!
2、Shell 会话(环境、上下文)
终端登录后,立马就自动运行一个bash会话(上下文空间、环境)
在这个bash会话中输入任何命令,就是运行在这个上下文中了;
环境中通常都有变量,例:
[root :linux1 ~]# a=5
[root :linux1 ~]# echo $a
5
然后在当前bash中再开启一个bash会话(子bash),然后打印$a
[root :linux1 ~]# bash
[root :linux1 ~]# echo $a
[root :linux1 ~]#
结论: 在bash_1中定义的变量,子bash中访问不到
解决办法:
用 export x=1000 这样的方式来定义变量
则该变量在当前shell以及所有派生出来的shell中都能访问;
export 将变量的范围作用在所有的子bash中
source 将子bash定义的变量作用在当前bash
二、Shell脚本入门
1、第一个Shell脚本
在命令控制台输入vi helloworld.sh,创建helloworld.sh文件并编辑
#!/bin/bash
echo "helloworld"
注意:脚本以#!/bin/bash开头(指定解析器)
2、脚本的常用执行方式
(1)采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)
- sh 脚本的路径
sh /home/doit/datas/helloworld.sh - bash 脚本的路径
bash /home/doit/datas/helloworld.sh
(2)采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
- 赋予helloworld.sh 脚本的+x权限:chmod 777 helloworld.sh
执行:./helloworld.sh
注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。
第二种执行方法,本质是脚本需要自己执行,所以需要执行权限
(3)在当前shell中解析执行脚本文件中的命令
前两种方式,都是在当前shell中开启一个子shell来解析执行脚本中的命令
(脚本中定义的变量,就不会在当前shell中存在,只存在于新起的子shell)
以下2种方式,则是在当前shell中解析执行脚本文件中的命令
(如果脚本中有定义变量,运行完后,就是定义在了当前shell环境中
- source ./doit.sh
- . ./doit.sh(doit.sh应在父目录中)
(4)配置系统环境变量执行脚本
将脚本所在的文件夹配置到系统环境变量中,过程:
vi /etc/profile
点击i进入编辑模式
在pash后面加上":脚本所在文件夹路径"(在windows中path用;来结尾,linux中path用:来结尾)
退出并保存
source /etc/profile 将profile文件的变量作用到当前bash
此时,只要有执行权,在任意目录下都可直接写该脚本的名字执行该脚本
直接a.sh就可执行
三、shell变量
1、系统变量
set 查看系统中的所有变量,然后用"$变量名"获取变量值
$PWD : 代表当前所在的工作路径
$USER : 代表当前登录的用户名
$? : 代表当一条命令执行后的返回码
2、自定义变量
(1)变量定义
- 定义变量:变量=值
- 撤销变量:unset 变量
- 声明静态变量:readonly变量,注意:不能unset
(2)变量定义规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
- 等号两侧不能有空格
- 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
- 变量的值如果有空格,需要使用双引号或单引号括起来。
A=5 普通的变量
readonly B=2 只读变量
echo $A 在控制台打印A变量的值
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
变量的值如果有空格,需要使用双引号或单引号括起来 D="I love banzhang"
(3)变量的取值
有三种方式:
- $A
- ${A}
- “$A”
(4)变量的运算
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
echo 1+2
输出:1+2
要进行运算的语法:
- $((a+b))
- $[a+b]
a和b可以是数值,也可以是变量。若a、b变量值有一个不是数值,则将它当0处理。
a=q
b=2
echo $[a+b]
结果:2
echo $((1+2))
输出:3
a=1
b=2
echo $(($a+$b))
输出:3
echo $((a+b))
输出:3
(5)export和source关键字
export name=lisi 将变量的范围作用在所有的子bash中
source ./doit.sh 执行子bash并将子bash定义的变量作用在当前bash
(6)单引号和双引号的区别
- 现象:单引号里的内容会全部输出,而双引号里的内容会有变化
- 原因:单引号会将所有特殊字符脱意
# $name 代表引用变量的值
echo $name is the most handsome man
结果:tom is the most handsome man
# 双引号中如果有 $name 变量引用,可以正常解析
echo "$name is the most handsome man"
结果:tom is the most handsome man
# 单引号中如果有 $name 变量引用,$符号被转义,没有任何特殊含义了,就不是引用变量了
echo '$name is the most handsome man'
结果:$name is the most handsome man
# \$ 也是把$符转义,那么 $name也不是变量引用了
echo "\$name is the most handsome man"
结果:$name is the most handsome man
# 双引号中,有单引号,这时,单引号不具备转义的功能了,所以$name可以正常解析
echo "'$name is the most handsome man'"
结果:'tom is the most handsome man'
# 错误写法,它代表一个空串+中间那一段+空串
echo ""$name is the most handsome man""
结果:tom is the most handsome man
# 双引号中需要嵌套双引号,可以把内层双引号用\转义
echo "\"$name is the most handsome man\""
结果:"tom is the most handsome man"
(7)``特殊转译
`是tab上面的那个键,可以将包裹的内容转译为执行后的结果,如:
mkdir date:创建一个名为date的文件夹
mkdir `date`:创建一个名为当前日期的文件夹
3、特殊变量
- $n:写在脚本里,用来接收脚本执行时传入的参数的变量 ,n为数字,$0代表命令本身,$1-$9代表第一到第9个参数,10以上的参数需要用大括号包含,如${10}
vi param.sh
#!/bin/bash
echo "hello $1 , are you a $2 ?"
[root :linux1 ~]# sh param.sh tom teacher
hello tom , are you a teacher ?
- $*:写在脚本里,代表传入的所有参数。把所有的参数看成一个整体,以"$1 $2 … $n"的形式输出所有参数
- $@:写在脚本里,代表传入的所有参数。把每个参数区分对待,以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数
- $#:写在脚本里,代表传入的参数的个数。
- $?:执行上一个命令的返回码; 执行成功,返回0,执行失败,返回非0(具体数字由命令决定)
- $$:当前进程的进程号(PID),即当前脚本执行时生成的进程号
- $!:后台运行的最后一个进程的进程号(PID),最近一个被放入后台执行的进程的进程号
$* 和$@的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以"$1" "$2" … "$n" 的形式输出所有参数
当它们被双引号" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数
四、read:控制台输入
语法:read [选项] 变量名
选项:
- -p(提示语句)
- -n(字符个数)
- -t(等待时间,单位为秒)
- –s(隐藏输入)
例:read –t 30 –p “please input your name: ” NAME
控制台提示:“please input your name:”并让用户输入,用户输入的值会被放到NAME变量中。30秒内用户无操作的话会自动退出。
使用$NAME即可取出用户输入的值。
五、算数运算
有两种方式:
- $((运算式))或$[运算式]
- expr 运算式 (这里的运算式需要用空格隔开,相当于是传参的形式)
y=`expr $x + 10`(注意这里用反引号括起来,说明他是个运算)
+ , - ,\ *, /, % 加,减,乘(注意乘要用转义符),除,取余
$符号功能总结:
- ${a} 取变量a的值
- $( ) 取一个命令的执行结果,效果与反引号相同。如$(date)
- $(( )) 取算术运算表达式的运算结果,效果与 $[ ] 相同。$((1+3))、$[1+3]
六、数组
数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小,数组元素的下标由 0 开始。
1、定义数组
- Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 value2 … valuen)
例:my_array=(A B “C” D) - 我们也可以使用下标来定义数组:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
2、读取数组
读取数组元素值的一般格式是:
${array_name[index]}
3、获取数组中的所有元素
使用@ 或 * 可以获取数组中的所有元素:
${array_name[*]}
${array_name[@]}
4、获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,在 前面加个#号
${#my_array[*]}
${#my_array[@]}
5、将脚本的输入参数转成一个数组
#!/bin/bash
arr=($@)
echo ${arr[1]}
6、遍历数组
#!/bin/bash
for var in ${arr[@]}
do
echo $var
done
七、字符串处理
1、获取字符串长度
${#str}
2、提取子串
语法:
- ${string:index} :在$string中,从index位置的字符开始提取子串
- ${string:index:length} :在$string中,从index位置的字符开始提取length长度的子串
echo ${NAME}
结果:ni hao, ming tian
echo ${NAME:3}
结果:hao, ming tian
echo ${NAME:3:6}
结果:hao, m
3、删除子串
语法:
- ${string#substring} :删除string开头处与substring匹配的最短子串
- ${string##substring} :删除string开头处与substring匹配的最长子串
- ${string%substring} :删除string结尾处与substring匹配的最短子串
- ${string%%substring} :删除string结尾处与substring匹配的最长子串
substring中有*号
echo $another_string
结果:20091114 Reading Hadoop
echo ${another_string#2*1}
结果:114 Reading Hadoop
echo ${another_string##2*1}
结果:4 Reading Hadoop
echo ${another_string%a*p}
结果:20091114 Reading H
echo ${another_string%%a*p}
结果:20091114 Re
若不写*号,则只是普通的截掉字串
name=babababababa
echo ${name%ba}
结果:bababababa
echo ${name%%ba}
结果:bababababa
echo ${name#ba}
结果:bababababa
echo ${name##ba}
结果:bababababa
4、替换子串
语法:
- ${parameter//pattern/string}
用string来替换parameter变量中所有匹配的pattern
- ${parameter/parttern/string}
从开头开始用string来替换第一个匹配的pattern
- ${parameter/#parttern/string}
从开头开始用string来替换第一个匹配的pattern
- ${parameter/%pattern/string}
从结尾开始用string来替换第一个匹配的pattern
name=babababababa
echo ${name//ba/ab}
结果:abababababab
echo ${name/ba/ab}
结果:abbababababa
echo ${name/#ba/ab}
结果:abbababababa
echo ${name/%ba/ab}
结果:bababababaab
八、条件判断
语法:
- [ 判断表达式 ]
注意表达式前后要有空格 - test 判断表达式
测试范围:整数、字符串、文件
1、字符串判断
- 判断是否相等:
test str1 == str2
[ str1 == str2 ] - 判断是否不相等:
test str1 != str2
[ str1 != str2 ] - 判断是否不为空:
test str1
[ str1 ] - 字符串的长度非零:
test –n 字符串
[ -n 字符串 ] - 字符串的长度为零:
test –z 字符串
[ -z 字符串 ]
str可以为一个字符串也可以为一个变量,是变量时要用$变量名取值,如:[ $a == $b ]
有时会用到-n -z来判断字符串长度,用到变量是要小心。比较一下两条语句
[monitor@msg7 .monitor]$ if [ -n $b ];then echo yes;else echo no;fi
yes
[monitor@msg7 .monitor]$ if [ -n "$b" ];then echo yes;else echo no;fi
no
$b是未定义一个的变量,但是有引号和没引号,-n给出了不同的答案。所以要记得加引号,才能正确识别字符串变量的长度。
2、整数判断
- 测试整数是否相等:
test int1 -eq int2
[ int1 -eq int2 ] - 测试int1是否>=int2:
test int1 -ge int2
[ int1 -ge int2 ] - 测试int1是否>int2:
test int1 -gt int2
[ int1 -gt int2 ] - 测试int1是否<=int2:
test int1 -le int2
[ int1 -le int2 ] - 测试int1是否<int2:
test int1 -lt int2
[ int1 -lt int2 ] - 测试整数是否不相等:
test int1 -ne int2
[ int1 -ne int2 ]
也可比较两个数值类型变量的大小,如:[ $a -ge $b ]
3、文件判断
- test -d path:指定文件是否目录
[ -d path ]、[ ! -d path ]、test ! -d path - test -f path:指定文件是否常规文件(是不是一个文件)
- test -L file:文件存在并且是一个链接(ln -s )
- test -e path:文件是否存在 exists
- test -r file:指定文件是否可读
- test -w file:指定文件是否可写
- test -x file:指定文件是否可执行
4、逻辑组合
多重条件语法:
- -a :and
- -o :or
- && :逻辑与,条件满足,才执行后面的语句
- ||:逻辑或,条件不满足,才执行后面的语句
[ ! -f /a ] && echo "成立" || echo "不成立"
a是个文件夹,这条语句的意思是判断a是否不是一个文件,结果:成立
九、流程控制
1、if判断分支
基本语法:
if [ 条件判断式 ]
then
程序
fi
多分枝:
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多条件
else
当所有条件都不成立时,最后执行此程序
fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
2、case判断分支
基本语法:
- case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
- 双分号“;;”表示命令序列结束,相当于java中的break。
- 最后的“*)”表示默认模式,相当于java中的default。
示例
#!/bin/bash
case $1 in
"1")
echo "banzhang"
;;
"2")
echo "cls"
;;
*)
echo "renyao"
;;
esac
3、for循环
基本语法有两种:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
for N in 1 2 3
do
echo $N
done
或
for N in 1 2 3; do echo $N; done
或
for N in {1..30}; do echo $N; done
示例:
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
#!/bin/bash
#打印数字
for i in $@
do
echo "ban zhang love $i "
done
4、while循环
基本语法:
while [ 条件判断式 ]
do
程序
...
done
示例:
#!/bin/bash
while [ true ]
do
# 间断性的请求一个URL
curl https://blog.csdn.net/qq_37933018/article/details/119154915
# 单位秒
sleep 10
done
sleep 10 : 休眠10秒
curl 路径:默认会发送 GET 请求并获取链接内容输出到标准输出
5、let命令
let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。
let no+=10,let no-=20,分别等同于 let no=no+10,let no=no-20
在循环体中,不能直接写i++(for循环条件中可以)
可以用let i++来实现自增
十、函数(方法)
1、系统自带函数
(1)basename基本语法(返回文件名)
basename [string / pathname] [suffix]
功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。如果pathname没有包含/,则输出`.’(表示当前目录).
选项: suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
(2)dirname基本语法(返回文件路径)
dirname 文件绝对路径
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
2、自定义函数
函数代表着一个或一组命令的集合,表示一个功能模块,常用于模块化编程。
重要说明:
在shell中,函数必须先定义,再调用
使用return value来获取函数的返回值
函数在当前shell中执行,可以使用脚本中的变量。
格式如下:
函数名()
{
命令1…..
命令2….
return 返回值变量
}
[ function ] funname [()]
{
action;
[return int;]
}
如果函数名后没有(),在函数名和{ 之间,必须要有空格以示区分。
函数返回值,只能通过$?系统变量获得,可以显示加:return 返回值,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
示例:
#!/bin/bash
function sum()
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
3、脚本调试
- sh -x 脚本名:可以打印出所执行的每一行命令以及当前状态
- 使用set -x和set +x对脚本进行部分调试
例:
#!/bin/bash
#文件名: debug.sh
for i in {1..6};
do
set -x
echo $i
set +x
done
echo "Script executed"
在上面的脚本中,只会打印出echo $i的调试信息,因为使用了-x和+x对调试区域进行了限制。
- sh -n 脚本名 :不执行脚本只是检查语法的模式,将返回所有语法错误
- sh –v 脚本名:执行并显示脚本内容
十一、高级文本工具
1、cut
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。并不会改变文件内容
语法:cut [选项参数] filename
选项参数:
- -d:分隔符,按照指定分隔符分割列。默认分隔符是制表符 \t
- -f:列号,提取第几列
案例:
(1)数据准备
$ vi cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
(2)切割cut.txt第一列
$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le
(3)切割cut.txt第二、三列
$ cut -d " " -f 2,3 cut.txt
shen
zhen
wo
lai
le
(4)在cut.txt文件中切割出guan
$ cat cut.txt | grep "guan" | cut -d " " -f
guan
grep:在文件中搜寻字串匹配的行并输出。所以是先搜索出有‘guan’的那一列。再分割输出
2、sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
语法:sed [选项参数] ‘命令’ filename
选项参数 :
- -e:直接在指令列模式上进行sed的动作编辑。[默认值,可省略,但进行多项操作时,需加上,该选项会将其后跟的脚本命令添加到已有的命令中。]
- -f:脚本命令文件:该选项会将其后文件中的脚本命令添加到已有的命令中。
- -n:默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。
- -i:直接编辑文件
命令参数:
- a:新增,a的后面可以接字串,在下一行出现
- d:删除
- s/查找内容/替换内容/:查找并替换
- g:global 全局操作
案例 :
(1)数据准备
$ vi sed.txt
dong shen
guan zhen
wo wo
lai lai
le le
(2)将“mei nv”这个单词插入到sed.txt第二行下,打印。
$ sed '2a mei nv' sed.txt
dong shen
guan zhen
mei nv
wo wo
lai lai
(3)删除sed.txt文件所有包含wo的行
$ sed '/wo/d' sed.txt #这里的/wo/的意思是搜索wo
dong shen
guan zhen
lai lai
le le
(4)将sed.txt文件中wo替换为ni
$ sed 's/wo/ni/g' sed.txt
dong shen
guan zhen
ni ni
lai lai
le le
注意:‘g’表示global,全部替换
(5)将sed.txt文件中的第二行删除并将wo替换为ni
$ sed -e '2d' -e 's/wo/ni/g' sed.txt
dong shen
ni ni
lai lai
le le
特别有用的几个用法:
- 删除文件中的空行
sed -i ‘/^$/d’ sed.txt - 给指定3-5行范围添加注释
sed -i ‘3,5s/^/#/’ sed.txt - 给所有行范围添加注释
sed -i ‘s/^/#/’ sed.txt - 给指定行范围删除注释
sed -i ‘s/^#//’ sed.txt - 在指定模式匹配的行(下)追加一行
sed ‘/^hi/a\this is appended line’ sed.txt - 在指定模式匹配的行(上)追加一行
sed ‘/^hi/i\this is appended line’ sed.txt
3、awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
语法:awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项参数:
- -F:指定输入文件折分隔符
- -v:赋值一个用户定义变量
案例:
#以:分割为列,搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。
awk -F : '/^root/{print $7}' passwd
#以:分割为列,搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间加“,”号。
awk -F : '/^root/{print $1","$7}' passwd
#以:分割为列,只显示passwd的第一列和第七列,中间加逗号,且在所有行前面添加列名user,shell,在最后一行添加"hunter,/bin/zuishuai"。
awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "hunter,/bin/zuishuai"}' passwd
#以:分割为列,将passwd文件中第3列增加数值1并输出
awk -v i=1 -F: '{print $3+i}' passwd
awk的内置变量
- FILENAME:当前文件名
- NR:已读的记录数(正在读取的行的行号)
- NF:浏览记录的域的个数(正在读取的行的列数)
案例:
(1)数据准备
cat a.txt
1,zs,18
2,ls,18
3,ww,18
4,zs,18,jj
(2)以:分割为列,统计a.txt的文件名,每行的行号,每行的列数
#以:分割为列,统计a.txt的文件名,每行的行号,每行的列数
awk -F: '{print "filename:" FILENAME ", linenumber:" NR ",columns:" NF}' a.txt
filename:a.txt, linenumber:1,columns:3
filename:a.txt, linenumber:2,columns:3
filename:a.txt, linenumber:3,columns:3
filename:a.txt, linenumber:4,columns:4
注意:只有匹配了pattern的行才会执行action
BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
4、sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
语法:sort(选项)(参数)
选项:
- -f 排序时,将小写字母视为大写字母
- -n 依照数值的大小排序
- -r 以相反的顺序来排序
- -t<分隔字符> 设置排序时所用的分隔字符
- -k 按指定的列进行排序
参数:指定待排序的文件列表
案例:
(1)数据准备
vim sort.txt
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6
(2)按照“:”分割后的第三列倒序排序
$ sort -t : -nrk 3 sort.txt
bb:40:5.4
bd:20:4.2
cls:10:3.5
xz:50:2.3
ss:30:1.6
十二、定时任务调度
Linux中有一个后台服务,可以帮用户做定时的任务调度
这个服务的名称是: crond
crontab -e:打开定时任务文件,编辑你想实现的定时任务(写多个)
crontab -r:移除定时任务(正常是将不想要那行任务注掉)
定时任务编写:
把所有的任务,写入到一个可执行的文件
再在crontab -e里面配置执行任务
crontab -e配置命令格式:
* * * * * /bin/bash a.sh
分钟 小时 日 月 星期 命令 脚本
示例:
eg:每天4点备份
0 4 * * * cp -r /logs /root/
分 时 日 月 周
eg:每周二至周五,下午6点 的计划任务
0 18 * * 2-5 (2,3,4,5)
eg:1到10月份,每周二、周五,下午6点的计划任务
0 18 * 1-10 2,5
eg:周一到周五下午,5点半提醒学生15分钟后关机
30 17 * * 1-5 /usr/bin/wall < /etc/issue
45 17 * * 1-5 /sbin/shutdown -h now
eg:在每天 18:00至23 :00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh
0,30 18-23 * * * /apps/bin/dbcheck.sh
十三、jps查看 java进程
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。
jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path.
使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。
$> jps
23991 Jps
23789 BossMain
23651 Resin
比较常用的参数:
- -q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
- -m 输出传递给main 方法的参数,在嵌入式jvm上可能是null
- -l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
- -v 输出传递给JVM的参数