进程及数组相关命令简介
脚本高级命令
信号捕捉trap
trap ‘指令’ 信号 自定义触发信号
trap -l 列出所有信号
trap -p 列出自定义信号
trap ‘’ 信号 忽略信号操作
trap ‘-’ 信号 恢复原有信号
trap finish EXIT 退出脚本或异常退出时先执行完函数finish再退出
安装复制加权限install
-m 默认权限755,可更改
-o 改所有者
-g 改所属组
-d 创建目录,相当于mkdir
install /etc/hosts /data/hosts 复制默认加权限755
install -m 600 -o wei -g bin /etc/hosts /data/hosts
install -d /data/etc
小机器人,减少交互行为expect
- spawn 所需监控的进程,如scp
- expect 进程中所需监控的字符
- send 需要提交的字符
- interact 交互转换,常用于远程登录
- exp_continue 多次匹配
- set 定义变量
#取随机字符:mkpasswd
mkpasswd -l 15 -d 3 -C 5 长度15,数字3,大写字母3
#举例:远程复制文件免交互
[@rocky2 ~]#vim expect1
#!/usr/bin/expect
spawn scp /etc/redhat-release 10.0.0.7:/data
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "111111" }
}
expect eof
#执行
[@rocky2 ~]#chmod +x expect1
[@rocky2 ~]#./expect1
进程优先级命令
优先级范围 | 描述 |
---|---|
0-99 | 实时进程 |
100-139 | 非实时进程 |
进程优先级:
系统优先级:数字越小,优先级越高
0-139(CentOS 4,5),各有140个运行队列和过期队列
0-98,99(CentOS 6)
实时优先级: 99-0 值最大优先级最高
nice值:-20到19,对应系统优先级100-139或99
#调整优先级
nice -n -5 ping 10.0.0.7 执行前改优先级
renice -n -10 24183 -20到19范围=100~139,进程编号,执行完之后改
#优先级高不一定快
进程管理工具
查看线程ps、pstree、pidof
pstree -p {花括号表示多线程}
ps axo pid,cmd,ni 进程编号,进程名称,优先级
ps aux 查看进程详细
ps auxf 查看进程父子关系
pidof xxx 查看进程编号
ll /proc/901/exe 查看二进制程序,901是进程编号,也是磁盘文件
cat /proc/901/status 查看线程数,Threads:线程数 进程查看process
tail
#查看未知进程所在路径
ps aux 找进程编号
ll /proc/1111/exe 可通过连接文件exe找到路径
ps aux |grep java 查找相关程序
#也可一步搞定,有可能列出多个,有时可搭配-x
ll /proc/`pidof pickup`/exe
ll /proc/$(pidof pickup)/exe
uptime,w
uptime 当前机器时间,up机器开了多久, 几个用户在登录, (`load 1分钟,5分钟,15分钟内负载情况,建议不超5`)
[14:30:29 root@rocky2 ~]#uptime
14:43:43 up 1:09, 1 user, load average: 0.04, 0.05, 0.01
[14:30:29 root@rocky2 ~]#w
14:43:43 up 1:09, 1 user, load average: 0.04, 0.05, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 13:52 0.00s 0.02s 0.00s w
和性能相关的四个核心组件
cpu、内存、磁盘、网络
查看cpu
mpstat 可查看CPU使用情况,需下载sysstat包
mpstat 1 每一秒观察一次cpu使用情况
top
#实时显示进程运行情况(不退出)
[14:30:29 root@rocky2 ~]#top
top - 14:53:10 up 1:19, 1 user, load average: 0.01, 0.04, 0.00
Tasks: 150 total, 2 running, 148 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 1945.3 total, 1570.1 free, 175.7 used, 199.5 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1613.6 avail Mem
#运行时
M 按内存百分比排序
P cpu百分比排序
T cpu运行总时长
l/t 更改显示情况
1 查看单个cpu
#可用选项
-d 刷新时间间隔,默认三秒
-b 显示所有进程
-n 刷新多少次后退出
-H 查看线程信息
-p 指定进程编号
top -H -p 767
#高级别top,htop
yum -y install htop
内存 free vmstat iostat iotop
[14:30:29 root@rocky2 ~]#free -h
# 总内存 使用了的内存 剩余 缓冲/缓存 可使用
total used free shared buff/cache available
Mem: 1.9Gi 185Mi 1.4Gi 8.0Mi 360Mi 1.6Gi
Swap: 2.0Gi 0B 2.0Gi
[14:30:29 root@rocky2 ~]#echo 3 > /proc/sys/vm/drop_caches 释放缓冲(测试中用)一般不建议释放
pmsp 111 可查看进程所使用内存情况
vmstat 查看虚拟内存,以内存为参照物
iostat CPU的io信息
iotop 磁盘的io信息,需装iotop
io 访问情况i/o
网络 iftop nload nethogs iptraf-ng dstat
#查看网络访问量,yum -y install iftop nload nethogs iptraf-ng dstat
iftop
iftop -n 显示具体远程主机ip
nload
nethogs 可显示哪个程序占用带宽
iptraf-ng 监控网络的综合工具
ethtool eth0 查看总网络带宽
dstat 可替代vnstat和iostat的工具
[16:11:11 root@rocky2 ~]#dstat
You did not select any stats, using -cdngy by default.
----total-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read writ| recv send| in out | int csw
1 0 100 0 0| 0 0 | 59B 609B| 0 0 | 116 175
用户空间 内核空间 空闲 等待 被盗取| 磁盘io | 网络io | swap交换分区| 软中断 进程间切换
lsof 所有程序所打开的文件
lsof -i :22 检查22端口是哪个程序所打开
#查看已删除文件被谁正在打开
lsof | grep delete
#可恢复已经删除的被打开文件
ll /proc/886/fd/6 查找正在打开文件的程序886文件所在路径6
cat /proc/886/fd/6 > /data/a 写入所需恢复文件路径
cockpit
#可视化图形管理工具,需先安装,可当xshell用
yum -y install cockpit 下载
systemctl enable --now cockit.socket 启动
10.0.0.8:9090 远程浏览器访问端口
kill信号
#常用信号
-1 不重启服务重新加载配置文件
-2 ctrl+c
-3 ctrl+\
-9 强制终止进程,可能导致数据丢失
-15 正常终止进程
-0 错误检查,echo $?判断进程状态
-18 继续运行
-19 后台休眠
killall ping 直接关闭所有ping进程
killall -0 master &> /dev/null || systemctl restart postfix 检查进程master如不健康自动重启
查看后台进程;jobs
计划任务
单次计划任务at
#计划任务中标准输出会发邮件,记得关闭
#单次计划任务at
at 14:07或者now+5min 指定时间或者几分钟或执行,02:00 2016-09-20
at> touch /data/at.log
ctrl+d 退出
-l或atr 可查询计划任务
/var/spool/at/ 数据存放位置,重启不会丢失,已存于磁盘中,执行后会自动删除
-d 可删除计划任务文件at -l
systemctl status atd 检查at计划任务服务
周期性计划任务crond
#周期性计划任务,记得指定PATH变量
systemctl status crond 依赖于该服务
#系统周期性计划任务
格式存放于/etc/crontab
执行文件存放于/etc/cron.d/
#用户创建周期性计划任务crontab
-e 创建 ubuntu中需定义变量EDITOR=vim,默认使用的nano
-l 查看
-r 删除,全删
-u 指定用户执行
#时间格式,并且关系要写进需脚本里进行判断,*是每的意思,最小单位分钟
* * * * * echo aa >> /data/a.log
#分钟 小时 天 月 星期
*/10 2 1,10,20 * 0,6 /data/a.sh 每月的1号,10号,20号或者星期六,星期日的2点的每十分钟
1 2 1,10,20 * 0,6 /data/a.sh 每月的1号,10号,20号或者星期六,星期日的2点的第一分钟
#如需用到秒可用sleep
数组应用
使用前先声明数组
declare -f 显示已定义函数值
declare -F 仅显示函数名
declare -a ARRAY_NAME 普通数组声明用法
declare -A ARRAY_NAME 关联数组声明用法
二者不支持转换
unset xxx 删除数组
赋值举例
#普通数组赋值
weekdays[0]="Sunday"
weekdays[4]="Thursday"
num=({0..10})
title=("ceo" "coo" "cto") 中间空格隔开
#关联数组赋值
declare -A n75
n75[xxx]=xxx
declare -a 列出所有数组
${title[0]} 列出特定数组值,*和@显示该数组的全部值
${#title[*]} 列出数组里的个数,可作为新元素的下标,索引title[${#title[*]}]
数组简单应用
#查找var变量字符串,从左到右到第一次出现word,就删除word前面的所有字符
${var#*word}
#删除以word开头的部分
${var#word}
#保留最后一个word后面的内容,其余全删除
${var##*word}
${var##word}
#从右到左找到第一个word,删除word后面的字符
${var%word*}
${var%word}
#保留最后一个word前面的字符,其余删除
${var%%word*}
${var%%word}
#单个查找替换
${nginx_url/nginx/centos}
#多个查找替换
${nginx_url//nginx/centos}
#以该字符为行首
${nginx_url/#nginx/centos}
#以该字符为行尾
${nginx_url/%nginx/centos}
#删除
${var/word}
其余同上
#直接取文件名
[@rocky2 ~]#nginx_url=http://nginx.org/download/nginx-1.20.2.tar.gz
[@rocky2 ~]#echo ${nginx_url##*/}
[@rocky2 ~]#nginx-1.20.2.tar.gz