> 文章列表 > shell一些操作

shell一些操作

shell一些操作

文章目录

  • 【检查脚本目录】
    • 示例
  • 时间时区
    • 修改时间
    • 修改时区
      • 修改时区
      • 查看时区
    • 脚本从服务器同步
      • client主动同步
      • client被动同步
    • docker-compose 时区设置
    • kubernetes设置时区
  • 【按时间备份】
    • 实例
    • date命令
  • 【历史命令和快捷键】
    • 历史命令
    • 快捷键
  • 【重定向】
    • 相关符号
    • 脚本输出到黑洞
    • cat输入
    • dd命令创建文件
  • 【进程使用的文件】
    • 看进程使用的文件
    • 看文件被哪个进程使用
  • 【查看各种链接】
  • 【服务器查看外网出口ip】
  • 【开机自启动脚本】
  • 【/porc下查看资源】

【检查脚本目录】

cd `dirname $0`
dir_home     # 变量截取
## 语法
```shell
${变量名 选项 要删除部分 分隔符}
  • 选项
    ‘#’ 从左最短删除
    ‘##’ 从左最大上传
    % 从右最短删除
    %% 从右最大删除

示例

  • 域名截取
url=www.baidu.comecho ${url#*.}
baidu.comecho ${url##*.}
comecho ${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: timezmountPath: /etc/localtimereadOnly: truevolumes:- name: timezhostPath: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 45 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截取一下。


在这里插入图片描述