shell一些操作(脚本目录、时间和时区、按时间备份、历史命令、重定向、同级服务链接、查看出口ip、开机启动脚本、/porc下查看资源)
文章目录
【检查脚本目录】
cd `dirname $0`
dir_home
# 变量截取
## 语法
```shell
${变量名 选项 要删除部分 分隔符}
- 选项
‘#’ 从左最短删除
‘##’ 从左最大上传
% 从右最短删除
%% 从右最大删除
示例
- 域名截取
url=www.baidu.com
echo ${url#*.}
baidu.com
echo ${url##*.}
com
echo ${url%.*}
www.baidu
echo ${url%%.*}
www
【时间和时区】
修改时间
- 手动修改
date -s 14:36:00
date -s "2017-06-30 18:31:00"
- 同步阿里云(ntpdate)
yum install ntpdate -y
ntpdate ntp1.aliyun.com
修改时区
修改时区
mv /etc/localtime /tmp
- 修改为上海时间
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
- 修改成雅加达时间:
cp /usr/share/zoneinfo/Asia/Jakarta /etc/localtime
查看时区
date -R
Fri, 05 Jan 2018 07:27:19 +0800
脚本从服务器同步
client主动同步
- 配置密钥,使client非交互登录server
- client设置脚本从server器同步
#!/bin/bash
date_server=`/usr/bin/ssh -p 17822 10.10.10.10 "date '+ %Y-%m-%d %H:%M:%S'"`
date -s "$date_server"
- 设置定时任务
client被动同步
思路同上,过程略。
docker-compose 时区设置
volumes:
- /tmp
##容器时间设置
- /etc/localtime:/etc/localtime
### 容器中java服务时间设置
- /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone
kubernetes设置时区
spec:
containers:
volumeMounts:
- name: timez
mountPath: /etc/localtime
readOnly: true
volumes:
- name: timez
hostPath:
path: /etc/localtime
【按时间备份】
实例
#!/bin/bash
####### 修改变量 #############
cd `doirname $0`
work_dir=`pwd`
# 时间标记设置如下
data_time=`date '+%Y%m%d-%H%M%S'`
########################
echo "开始更新后台"
cd ${work_dir}
docker-compose down
# 时间标记使用如下
mv screenos-web.jar screenos-web.jar-${data_time}
cp /tmp/screenos-web.jar ${work_dir}
docker-compose up -d
echo "后台已启动"
date命令
%H
小时(以00-23来表示)。
%I
小时(以01-12来表示)。
%K
小时(以0-23来表示)。
%l
小时(以0-12来表示)。
%M
分钟(以00-59来表示)。
%P
AM或PM。
%r
时间(含时分秒,小时以12小时AM/PM来表示)。
%s
总秒数。起算时间为1970-01-01 00:00:00 UTC。
%S
秒(以本地的惯用法来表示)。
%T
时间(含时分秒,小时以24小时制来表示)。
%X
时间(以本地的惯用法来表示)。
%Z
市区。
%a
星期的缩写。
%A
星期的完整名称。
%b
月份英文名的缩写。
%B
月份的完整英文名称。
%c
日期与时间。只输入date指令也会显示同样的结果。
%d
日期(以01-31来表示)。
%D
日期(含年月日)。
%j
该年中的第几天。
%m
月份(以01-12来表示)。
%U
该年中的周数。
%w
该周的天数,0代表周日,1代表周一,异词类推。
%x
日期(以本地的惯用法来表示)。
%y
年份(以00-99来表示)。
%Y
年份(以四位数来表示)。
%n
在显示时,插入新的一行。
%t
在显示时,插入tab。
MM
月份(必要)
DD
日期(必要)
hh
小时(必要)
mm
分钟(必要)
ss
秒(选择性)
【历史命令和快捷键】
历史命令
- !历史记录编号
- !cat 以cat开头的上一条命令
- !$上一次使用路径
例:
ls /usr/local/nginx
cd !$
- !!上一条命令
快捷键
-
结束服务
ctrl + c 正常结束
ctrl + d 退出
ctrl + z 挂起到后台 -
命令行
ctrl + a 命令行首
ctrl + e 命令行尾
ctrl + l 清屏
ctrl + s 锁屏
ctrl + q 解锁
说明:锁屏之后命令仍会执行,仅屏幕不显示了。
【重定向】
相关符号
- 0 输入
- 1标准输出
- 2错误输出
- > , >> 正确输出
- 2> , 2>> 错误输出
- &> 合并重定向
- < , << 输入
脚本输出到黑洞
说明:将错误合并到正确,并且输入黑洞。
./test.sh > /dev/null 2>&1
cat输入
回车输入,直到行尾出现ABC。
注意结尾符前边是 << ,不是<。
cat > 文件名 << EOF
aaaaaaa
bbbbbbb
cccccccc
EOF
dd命令创建文件
dd if=/dev/zero of=/tmp/1.txt bs=1M count=2
【进程使用的文件】
看进程使用的文件
lsof -p ID号
看文件被哪个进程使用
fuser -m 目录名
如umount不能卸载的时候,查看哪个进程在使用,然后kill掉(见psmisc工具)
【查看各种链接】
### 统计服务器各种连接
netstat -n|awk '/^tcp/{++S[$NF]}END{for (key in S) print key,S[key]}'
说明:
- NF表示该行字段数
- ++S[$NF] 表示最后一列每个字串出现的次数
awk -F : '{print ++S[$NF]}' /etc/passwd
- key in S 则key就是每行的最后一列
最后打印了key 和 S
【服务器查看外网出口ip】
curl http://ifconfig.me
【开机自启动脚本】
- 编写脚本
# cat /etc/init.d/test.sh
#!/bin/sh
# chkconfig: 2345 96 14
#description:test.sh
date > /root/date.txt
说明:
2345: 代表设置在哪个level中是on的,需要在rc2.d~rc5.d目录下,创建名字为 S96test.sh 的文件连接,连接到/etc/rc.d/init.d目录下的的test.sh脚本,查看如下:#ll /etc/rc2.d lrwxrwxrwx. 1 root root 17 4月 5 05:23 S96test.sh -> ../init.d/test.sh
96/14:分别代表启动和关闭顺序
- 设置开机启动
chmod a+x /etc/init.d/test.sh
chkconfig --add test.sh
chkconfig test.sh on
chkconfig list
【/porc下查看资源】
- 内存
cd /proc && for i in `ls |awk '{print $8}'|grep '^[0-9]'`;do grep -H VmRSS $i/status 2>/dev/null;done|sort -k 2 -rn|head|awk -F [/:] '{print $1,$4}'
注意:|awk ‘{print $8}’ 这里是因为ls设置了别名,实际执行了ll 因此这里加了一个截取。
- swap分区使用
for i in `cd /proc;ls |grep "^[0-9]"|awk ' $0 >100'`;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps 2>/dev/null ; done | sort -k2nr | head -10
如果ls别名设置为ll,则也需要这awk截取一下。