本帖最后由 jiangmingzi 于 2023-9-27 18:21 编辑
HACK之道 2023-09-27 08:02 发表于重庆
1,写一个自己的日志命令:logmsg1)一般打印日志时需要记录时间戳,我们现在改写脚本“004-while.sh”,示例如下: - ……
- ##→编写LogMsg函数,每次调用,重新打印时间戳
- LogMsg () {
- local_time=`date +"%Y-%m-%d %H:%M:%S"`
- echo $local_time $1
- }
- ……
- if [ $sshd_count -lt 1 ]
- then
- LogMsg '没有找到ssh服务,重启该服务' #调用LogMsg函数
- systemctl start sshd
- else
- LogMsg 'ssh服务正常运行中...' #调用LogMsg函数
- fi
复制代码
重新执行,示例如下:- [root@linuxido /shell]# sh 004-while.sh
- 2021-06-07 07:35:11 ssh服务正常运行中...
- 2021-06-07 07:35:16 ssh服务正常运行中...
- ……
复制代码
2)如果每个脚本中都要写个LogMsg的方法,就会很麻烦,可不可以像使用其他命令一样,直接调用呢?例如echo、cat我们先来新建logmsg脚本。示例如下: - [root@linuxido /shell]# vi logmsg.sh ##→编辑logmsg.sh脚本
- ……
- LogMsg() {
- local_time=`date +"%Y-%m-%d %H:%M:%S"`
- echo $local_time $1 #此时的$1是指调用LogMsg时输入的第一个参数
- }
- LogMsg $1 #调用LogMsg函数,此时的$1是指调用脚本时输入的第一个参数
复制代码
3)虽然写了logmsg脚本,但是没法在文件目录以外的地方使用。还记得前面章节所说的,命令一般放在哪个目录吗?当然是/bin目录了。 - ##→创建logmsg命令的符号链接
- [root@linuxido /shell]# ln -s /shell/logmsg.sh /bin/logmsg
- [root@linuxido /shell]# logmsg ##→直接执行logmsg命令
- -bash: /usr/bin/logmsg: 权限不够 ##→执行时发现虽然调用了/usr/bin,但权限不够
- [root@linuxido /shell]# chmod 555 /bin/logmsg ##→赋予555权限,所有用户可读可执行
- [root@linuxido ~]##→logmsg linuxido.com ##→直接执行logmsg命令,参数为yaomm
- 2021-06-07 23:25:19 linuxido.com ##→执行成功
复制代码
(4)为什么/bin目录下的命令可以在任何目录下直接执行呢?因为环境配置的原因,/bin目录下的命令直接被赋予了全局调用的环境。 注意:除了echo,还可以使用print、printf打印文本。 2,写一个常用的备份命令:backup1)编辑backup脚本,先故意命名bachup.sh。 - [root@yaomm shell]# vi bachup.sh ##→编写备份脚本
- #!/bin/bash
- # description:编写备份常用脚本
- # date:2020-06-26
- # filename:bachup.sh
- # author:linuxido.com
- # 编辑backup函数,将要备份的文件名添加上时间戳之后改名
- function backup() {
- newfile=$1.`date +%Y-%m-%d.%H%M.bak`; ##→新文件名称,加上时间戳
- cp -p $1 $newfile; ##→复制一份文件
- echo "Backed up $1 to $newfile."; ##→打印成功日志
- }
- backup $1 ##→调用backup函数
复制代码
2)创建/bin目录下的脚本链接,将bachup.sh链接为/bin/backup。 - [root@yaomm shell]# ln -s /shell/bachup.sh /bin/backup ##→创建链接,注意全路径
- [root@yaomm shell]# ll /bin/backu*
- ##→创建成功
- lrwxrwxrwx 1 root root 16 Jun 20 10:33 /bin/backup -> /shell/bachup.sh
- [root@yaomm shell]# chmod 555 /bin/backup.sh ##→赋予所有用户执行权限
- [root@yaomm shell]# touch sss.txt ##→创建测试脚本
- [root@yaomm shell]# backup sss.txt ##→备份测试
- Backed up sss.txt to sss.txt.2021-06-20.1034.bak. ##→备份成功
- [root@yaomm shell]# ll
- -rw-r--r-- 1 root root 0 Jun 20 10:31 sss.txt ##→原文件
- -rw-r--r-- 1 root root 0 Jun 20 10:31 sss.txt.2021-06-20.1034.bak ##→备份文件
复制代码
3,写一个Java项目的管理脚本:springboot-admin.sh在做Java开发、运维、测试的工作中,和Spring Boot打交道的地方很多。怎么轻松管理一个Spring Boot的项目部署呢?借着这个来自GitHub的开发者junbaor的优秀实例,我们来看看一个Shell脚本是如何炼成的。 修改后的脚本详见本书代码网盘(详见“前言”)。简略代码如下:
- operation=$1 ##→第一个参数,start、stop、restart、status
- springboot=$2 ##→第二个参数,Jar包名
- ##→校验参数是否为空
- showUsage() {
- ##→校验第一个参数是否为空
- if [ "$operation" == "" ]; ##→注意:中括号[]两端至少要有一个空格
- ……
- ##→校验第二个参数是否为空
- if [ "$springboot" == "" ];
- ……
- count=`ls $springboot | wc -l` # 校验jar包是否存在
- ……
- }
- ##→启动springboot项目
- function start()
- {
- count=`ps -ef |grep java|grep $springboot|grep -v grep|wc -l`
- if [ $count != 0 ];then
- echo "$springboot is running..."
- else
- ls $spring
- ##→启动springboot项目,反斜杠连接命令
- nohup java -server -Xmx1g -Xms1g -Xss512k \
- -jar $springboot > /dev/null 2>&1 &
- ##→调换提示位置
- echo "Start $springboot success..."
- fi
- }
- ##→关闭springboot项目
- function stop()
- {
- ……
- count=`ps -ef |grep java|grep $springboot|grep -v grep|wc -l`
- ##→先用kill -15 发出停止信号,等待springboot自行关闭
- if [ $count != 0 ];then
- echo "Stop Success! 优雅关闭 $springboot Process..."
- kill $boot_id
- fii
- ……
- }
- ##→重启springboot项目,关闭后停止两秒重新启动
- function restart()
- {
- stop
- ##→睡眠两秒调用start方法
- sleep 2
- start
- }
- ##→查看springboot项目的启动状态
- function status()
- {
- count=`ps -ef |grep java|grep $springboot|grep -v grep|wc -l`
- jarStatus=`ps -ef |grep java|grep $springboot`
- ……
- }
- showUsage ##→先验证参数是否为空
- ##→只有第一个输入变量是 start|stop|restart|status的时候,才执行对应的方法
- case $1 in
- start)
- start;;
- stop)
- stop;;
- restart)
- restart;;
- status)
- status;;
- *)
- echo -e "\033[0;34m 请正确操作:{start|stop|restart|status}.\n Example:bash springboot-admin.sh start test-springboot.jar \033[0m"
- esac
- 执行脚本:
- [root@yaomm shell]# sh springboot-admin.sh start xx.jar ##→执行一个不存在的jar包
- ls: cannot access xx.jar: No such file or directory ##→v0.3应该解决这个问题
- xx.jar不存在
- [root@yaomm shell]# sh springboot-admin.sh reload /home/deploy/face-0.0.1-SNAPSHOT.jar
- 请正确操作:{start|stop|restart|status}. ##→reload不存在已有选项中
- Example:bash springboot-admin.sh start test-springboot.jar
- [root@yaomm shell]# sh springboot-admin.sh start /home/deploy/face-0.0.1-SNAPSHOT.jar
- ……
- Start /home/deploy/face-0.0.1-SNAPSHOT.jar success... ##→正常启动
- [root@yaomm shell]# sh springboot-admin.sh stop /home/deploy/face-0.0.1-SNAPSHOT.jar
- Stop /home/deploy/face-0.0.1-SNAPSHOT.jar ... ##→正常关闭
- Stop Success! 优雅关闭 /home/deploy/face-0.0.1-SNAPSHOT.jar Process...
- 我们可以通过将脚本放入/usr/bin下或建立systemd服务的方式进行服务控制,这个可以做到如下效果:
- systemctl start xxx.jar ##→方法1
- springboot-admin start xxx.jar ##→方法2
复制代码
小结在学习完本章内容后,我们已经掌握了Shell的基本环境配置与常用的内置变量,基本的语法操作与简单的脚本编写,知道了怎样写一个自己的Shell命令,怎样使用Shell命令实现一个服务的管理。
|