进程和计划任务管理
ps 进程管理工具
包含带-的不带-的选项
ps 查看当前终端进程
ps a 查看所有终端的进程
ps ax 查看所有和终端无关的进程
ps axu 显示进程的所有者
ps uxaf 查看进程的父子关系
ps xo cmd,%CPU k %cpu 排序查看cmd和CPU相应的列 按CPU排序
ps k %cpu 按CPU排序
ps L 查看所有的属性
renice -n -10 2612 更改进程2612的优先级为-10
[root@contes6 ~]# ps axu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
用户 占用CPU百分比 占用内存百分比 承诺内存大小 终端编号 状态 开启时间 占用cup时间片 进程程序名
top 命令可以动态的跟踪内存CPU情况
top - 10:51:32 up 25 min, 2 users, load average: 0.00, 0.00, 0.00 :这一行是uptime命令的结果显示
Tasks: 142 total, 1 running, 141 sleeping, 0 stopped, 0 zombie
tasks 进程
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
0.0%us, :用户空间使用
0.2%sy :系统空间占用
0.0%ni :调整优先级
99.7%id :空闲的cpu
0.0%wa :等待的CPU
0.0%hi :硬中断,例如我键盘敲了一下,硬件就会给CPU发信号,我这边发生了什么事
0.2%si :软中断,应用程序发生了事,CPU去响应
0.0%st :被盗取得时间
Mem: 1004112k total, 352980k used, 651132k free, 22272k buffers
Swap: 2097148k total, 0k used, 2097148k free, 125148k cached
默认是cpu排序
大写M是内存排序
大写P是CPU排序
小写l是隐藏uptime命令结果,在敲l显示uptime命令结果
小写t是隐藏和显示进程的情况
数字1是显示cpu
小写m控制内存的显示情况
q退出当前界面
s修改刷新的间隔时间
top -d 5 指定刷新间隔为5秒
k指定杀死进程,输入进程编号
大写W是保存到文件,默认保存到家目录是隐藏文件 .toprc
top -b 查看所有进程
top -n 刷新3次自动退出
top -n 3 -b -d 2 :显示全部进程,刷新的间隔时间为2秒,总共刷新3次
htop 带颜色的进程管理工具
yum install htop
free查看内存使用情况
echo 1 > /proc/sys/vm/drop_caches 清除内存里面的缓存
VMstat :专门查看管理虚拟内存信息
vmstat 1 :1秒执行一次
vmstat 2 3 :2秒刷新一次,刷新3次就退出
iostat :显示内存和cup的信息
iiostat 1 1秒执行一次
pmap :进程和内存的对应关系
pmap 1 :pmap后加进程编号
pmap -x 1 :显示详细信息
cat /proc/1/maps 查看1进程编号的内存具体使用情况
glancens 远程监控工具
yum install glances
开启glances ,在被监控端,以服务器的方式开启,开启以后会监控一个端口,然后在另一台机器以glances客户端连接被监控的主机
glances -s -B 192.168.249.141
-s 服务器
-B 监控的ip端口
ss -nlt 检查ip端口服务是不是被启动
glances -c 192.168.249.141 在客户端开启glances 连接被监控的服务器
dstat工具,系统资源统计,代替vmstat,iostat
yum install dstat
dstat --top-cpu 查看CPU占用最高的进程
dstat --top-io 内个磁盘消耗的读写最多
iotop用来观察和磁盘I/O相关的工具
yum install iotop
pidof ping 查看ping命令的进程编号
kill 向进程发送控制信号
1 信号 让某个进程挂起,同时重新读取配置文件
2 信号 终止正在执行的程序
3 信号 相当于ctrl+\
15信号 正常退出
18 信号继续执行
19 信号进程休眠
9 信号 强制杀死进程
killall 后面跟进程的名称 :同时杀死相同名字的进程
例:killall httpd
pkill -t pts/0 杀死pts/0的所有进程,默认的信号是15
pkill 和pgrep共用一个man帮助
pkill 支持扩展正则表达式
前后台切换
进程有两种前台和后台进程
前台执行占用终端资源,前台进程如果不结束,终端资源就没有办法被其他命令执行
后台执行:在命令的后面加一个& ,就变成后台执行,不耗费终端资源
输出结果还是在终端是显示,但是可以执行其他命令
例:ping 172.20.0.1 &
jobs 可以查看正在执行的后台进程
[1]+ Running ping 172.20.0.1 &
将后台进程变成前台进程
fg 1 :1是jobs查看的后台进程的编号,
在执行后台程序的时候不能用crtl+c 结束,要把它变成前台进程或者来来来杀死进程
将前台进程变成后台进程
例:ping 172.20.0.1 前台进程
Ctrl+z 把正在执行的前台进程变成后台进程,但是是休眠状态
[1]+ Stopped ping 172.20.0.1
stopped 后台休眠
把后台休眠变成后台执行
bg 1
或
killall -18 ping
把后台运行变成后台休眠
killall -19 ping
把后台进程杀死
1:jobs 查看后台进程编号
[1]+ Running ping 172.20.0.1 &
2:kill %1 :%后面跟的是jobs查看到的进程编号
后台的作业,虽然在后台执行但是和终端相关,终端关闭,后台作业就停止
如果真正执行后台备份忽然断网怎么办?
可以开启一个异常共享会话 screen
如果断网可以用 screen -r 恢复
1:screen 创建一个单独的会话
2:ping 172.20.0.1 & 在单独的会话中执行后台命令
3:screen -r :如果忽然断网,可以用 -r恢复继续执行
或
nohup ping 172.20.0.1 &
将后台的屏幕输出放到 nohup.out 文件里面
让3个命令工具同时执行,并行执行
第一种方法:vim all.sh
#/bin/bahs
ping 127.1 &
ping 127.2 &
ping 127.3 &
第二种方法:(ping 127.1 &);(ping 127.2 &);(ping 127.3 &)
第三种方法:{ ping 127.1 & ping 127.2 & ping 127.3 & }
任务管理
分为一次性任务计划和周期性任务计划
在未来的某个时间执行 ,一次性计划任务 at
rpm -ivh at-3.1.13-22.el7.x86_64.rpm 安装at包
systemctl status atd 查看是不是running状态,如果不是手动开启
centos7 开启:systemctl start atd
systemctl enable atd
centos6 开启:service atd start
at -V 显示版本信息
题外:永久同步时间
centos 7: vim /etc/chrony.conf
server 172.20.0.1 iburst 加入这一行
centos 6: vim /etc/ntp.conf
server 172.20.0.1 iburst 加入这一行
ntpdate 172.20.0.1 同步服务器时间
centos7 开启服务
systemctl enable chronyd 开机启动
systemctl start chronyd 启动服务
centos6 开启服务
chkconfig ntpd on 开机启动
service ntpd start 开启服务
[root@centos6 ~]#at 18:00 设置将来的一个时间
at> rm /data/* -rf 要执行的任务
at>
job 1 at 2018-05-05 18:00 显示有一个任务计划在几点几分执行
at -l 查看任务计划
1 2018-05-05 18:00 a root
at -c 1 :查看第1个任务计划的内容
任务计划被放在文件里面,重启不会丢失
cat /var/spool/at/a000010183f558
[root@centos6 ~]#at now + 15minutes 在未来的15分钟
at> wall class is over 发一个广播
at>
job 2 at 2018-05-05 15:56
查看任务计划
[root@centos6 ~]#at -l
1 2018-05-05 18:00 a root
2 2018-05-05 15:56 a root
at -d 1 :删除第一个任务计划
-l 查看任务列表
-c 查看任务计划内容
-d 删除任计划
-f 读取任务文件
-m 强制发邮件
创建一个广播文件
[root@centos6 ~]#cat > f1.txt
wall hello ha ha ha
在未来的一分钟执行文件
[root@centos6 ~]#at -f f1.txt now + 1minutes
job 3 at 2018-05-05 15:50
如果计划任务带标准输出,不会在当前终端显示,但是它会以邮件的方式发给你
如果计划任务里面有标准输出会造成大量的垃圾邮件,把标准输出重定向到&> /dev/null
at -m 如果你不知道你的任务计划执没执行,就加一个-m强制发邮件
白名单和黑名单:可以规定哪个用户可以执行计划,哪个用户不可以执行任务计划
白名单 :/etc/at.allow 默认不存在,要创建,将用户加入白名单
黑名单 :/etc/at.deny 默认存在 将用户写入文件,用户就不能执行任务计划
如果有白名单,只有白名单里面的用户能执行任务计划,其他用户不能执行
如果没有有白名单,只有黑名单那只有黑名单里面的用户不能执行任务计划,其他用户都可以
用脚本创建计划任务
#!/bin/bash
at 18:00 < rm /data/* -rf end 周期性计划任务 cron rpm -ivh /mnt/cdrom/Packages/cronie-1.4.11-17.el7.x86_64.rpm centos7 :启动服务 systemctl start crond 开机启动 systemctl enable crond centos6 :启动服务 service crond start 开机启动 rpm -ivh /misc/cd/Packages/cronie-anacron-1.4.4-16.el6_8.2.x86_64.rpm 补充工具,用于监控cronie任务执行情况,如果任务计划在该执行的时间点没有执行,则anacron会随后启动一次任务计划 cat /etc/anacrontab rpm -ivh /misc/cd/Packages/crontabs-1.10-33.el6.noarch.rpm 包括了和系统相关的辅助性计划任务 /etc/crontab :属于系统的关于任务计划的配置文件,这个文件定义了计划任务相关信息 [root@centos7 ~]#cat /etc/crontab SHELL=/bin/bash :用的shell类型 PATH=/sbin:/bin:/usr/sbin:/usr/bin :计划任务有一些可执行程序,这些程序在哪个路径下搜索 MAILTO=root :如果计划发现信息,给相应的人发邮件 # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) 几分钟 # | .------------- hour (0 - 23) 几小时小时 # | | .---------- day of month (1 - 31) 几天 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... 一年12个月 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 星期几,也可以 1-5显示星期一到星期五 # | | | | | # * * * * * user-name command to be executed *代表每分钟,每小时,每天,每月,每星期 例: 52 16 * * * root wall hello 16点52分 每天 每月 每星期 root用户 执行广播 例: 1 17 * * * root tar zcvf /data/etc.tar.gz /etc/ &> /dev/null 5点01分 每天 每月 每星期 root用户执行/etc/下的文件压缩到data目录下 ,并重定向到垃圾黑洞 标准输出重定向到/dev/null ,不然会发送垃圾邮件 16 17 1,10,20 * * root 1号,10号,20号,每月每星期17点16分 root用户执行某程序 16 17 1,10,20 * 0,6 root tar Jcvf /data/etc.tar.xz /etc/ &> /dev/null 1号,10号,20号或星期日和星期六17点16分 root用户执行程序 #!/bin/bash ti=`date +%u` [ $ti -eq 6 -o $ti -eq 0 ] && wall hello chmod +x f2.sh vim /etc/crontab 40 17 * * * root /root/f2.sh 每天每月每星期17点40执行f2.sh脚本 #!/bin/bash ti=`date +%u` [ $ti -eq 6 -o $ti -eq 0 ] && wall hello vim /etc/crontab 40 17 1.10,20 * 0,6 root /root/f2.sh 每月的1号10号20号并且星期日和星期六执行程序 */10 17 1.10,20 * 0,6 root /root/f2.sh 17点每10分钟执行一次 vim /etc/crontab * * * * * root f2.sh root用户每分钟执行一次脚本 vim /etc/crontab 1 * * * * root f2.sh root用户每小时的第一分钟执行一次脚本 vim f3.sh md0 命令 leep 20 休眠20秒 md20 命令 leep 20 休眠20秒 md30 命令 vim /etc/crontab * * * * * root f3.sh 每20秒执行一次命令 usleep可以精确到微秒 1000000微秒等于一秒 @monthly root /root/f2.sh 每月1号执行一次文件 @reboot root /root/f2.sh 当重启的时候执行某个操作 @hourly 一小时执行一次 @daily 一天执行一次 @weekly 一周执行一次 @monthly 一月执行一次 @annually 一年执行一次 cat /var/log/cron 日志记录了当前发生的事件 每个单用户创建任务计划用 crontab crontab -e 要创建计划任务 * * * * * wall hello 每分钟广播一次 不需要写用户名 cat /var/spool/cron 计划任务放在这个文件,放在磁盘上 在root用户编辑普通用户的计划任务 crontab -l -u wang 查看wang用户的计划任务 crontab -e -u wang 编辑wang用户的计划任务 crontab -r -u wang 删除wang用户的计划任务 单用户的白名单和黑名单 白名单 :/etc/cron.allow 默认不存在,要创建,将用户加入白名单 黑名单 :/etc/cron.deny 默认存在 将用户写入文件,用户就不能执行任务计划 在cron里面的%号有特殊含义,不能直接使用,写在脚本里面直接调用 练习题 1、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz” ,其中日期是前一天的时间 vim time.sh #!/bin/bash date -d "-1 day" +%F-%H chmod +x time.sh vim /etc/crontab 05 21 * * * root tar Jcvf /data/etcbak-`. time.sh`.tar.xz /etc/ 2、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至 /tmp/meminfo.txt文件中 * */2 * * * cat /proc/meminfo |egrep "^(S|M)" >> /tmp/meminfo.txt 3、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高 于80%,就执行wall警报 vim disk.sh #!/bin/bash disk1=`df |grep "sd" |sed -r "s/.*[ ]+([0-9]{1,3}).*/\1/" |sort -nr |head -n1` disk2=`df -i |grep "sd" |sed -r "s/.*[ ]+([0-9]{1,3}).*/\1/" |sort -nr |head -n1` [ $disk1 -ge 80 -o $disk2 -ge 80 ] && wall Disk over 80% vim /etc/crontab */10 * * * 1-5 root disk.sh $RANDOM 产生随机数字 $[$uid%2] $uid是一个数字, [ $[$uid%2] -eq 0 ] 数字除2等于0就是偶数 任务计划分为两种: 第一种是一次性计划at 第二种是周期性计划crontab 一次性计划任务:在未来的某个时间执行一次性计划任务 at rpm -ivh at-3.1.13-22.el7.x86_64.rpm 安装at包 systemctl status atd 查看是不是running状态,如果不是手动开启 centos7 开启 :systemctl start atd centos6 开启 :service atd start at -V 显示版本信息 [root@centos6 ~]#at 18:00 设置将来的一个时间 at> rm /data/* -rf 要执行的任务 at> job 1 at 2018-05-05 18:00 显示有一个任务计划在几点几分执行 at -l 查看任务计划 1 2018-05-05 18:00 a root at -c 1 :查看第1个任务计划的内容 任务计划被放在at目录下的文件里面,重启不会丢失 cat /var/spool/at/a000010183f558 [root@centos6 ~]#at now + 15minutes 在未来的15分钟 at> wall class is over 发一个广播 at> job 2 at 2018-05-05 15:56 查看任务计划 [root@centos6 ~]#at -l 1 2018-05-05 18:00 a root 2 2018-05-05 15:56 a root at -d 1 :删除第一个任务计划 -l 查看任务列表 -c 查看任务计划内容 -d 删除任计划 -f 读取任务文件 -m 强制发邮件 创建一个广播文件 [root@centos6 ~]#cat > f1.txt wall hello ha ha ha 在未来的一分钟执行文件 [root@centos6 ~]#at -f f1.txt now + 1minutes job 3 at 2018-05-05 15:50 如果计划任务带标准输出,不会在当前终端显示,但是它会以邮件的方式发给你,这样就会造成大量的垃圾邮件,把标准输出重定向到&> /dev/null ,就不会收到邮件 at -m 如果你不知道你的任务计划执有没有执行,就加一个-m强制发邮件,到你的邮箱 白名单和黑名单:可以规定哪个用户可以执行计划,哪个用户不可以执行任务计划 白名单 :/etc/at.allow 默认不存在,要创建,将用户加入白名单 黑名单 :/etc/at.deny 默认存在将用户写入文件,用户就不能执行任务计划 规则 :如果有白名单,只有白名单里面的用户能执行任务计划,其他用户不能执行 如果没有白名单,只有黑名单那只有黑名单里面的用户不能执行任务计划,其他用户都可以 用脚本创建计划任务 #!/bin/bash at 18:00 < rm /data/* -rf end 周期性计划任务 cron rpm -ivh /mnt/cdrom/Packages/cronie-1.4.11-17.el7.x86_64.rpm centos7 :启动服务 systemctl start crond 开机启动 systemctl enable crond centos6 :启动服务 service crond start rpm -ivh /misc/cd/Packages/cronie-anacron-1.4.4-16.el6_8.2.x86_64.rpm 补充工具,用于监控cronie任务执行情况,如果任务计划在该执行的时间点没有执行,则anacron会随后启动一次任务计划 cat /etc/anacrontab rpm -ivh /misc/cd/Packages/crontabs-1.10-33.el6.noarch.rpm 包括了和系统相关的辅助性计划任务 /etc/crontab :属于系统的关于任务计划的配置文件,这个文件定义了计划任务相关信息 [root@centos7 ~]#cat /etc/crontab SHELL=/bin/bash :用的shell类型 PATH=/sbin:/bin:/usr/sbin:/usr/bin :计划任务有一些可执行程序,这些程序在哪个路径下搜索 MAILTO=root :如果计划发出信息,给相应的人发邮件 # For details see man 4 crontabs # Example of job definition: # .—————- minute (0 – 59) 几分钟 # | .————- hour (0 – 23) 几小时小时 # | | .———- day of month (1 – 31) 几天 # | | | .——- month (1 – 12) OR jan,feb,mar,apr … 一年12个月 # | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 星期几,也可以 1-5显示星期一到星期五 # | | | | | # * * * * * user-name command to be executed * * * * *代表每分钟,每小时,每天,每月,每星期 例: 52 16 * * * root wall hello 16点52分 每天 每月 每星期 root用户 执行广播 例: 1 17 * * * root tar zcvf /data/etc.tar.gz /etc/ &> /dev/null 5点01分 每天 每月 每星期 root用户执行/etc/下的文件压缩到data目录下 ,并重定向到垃圾黑洞 标准输出重定向到/dev/null ,不然会发送垃圾邮件 例: 16 17 1,10,20 * * root 1号,10号,20号,每月每星期17点16分 root用户执行某程序 例: 16 17 1,10,20 * 0,6 root tar Jcvf /data/etc.tar.xz /etc/ &> /dev/null 1号,10号,20号或星期日和星期六17点16分 root用户执行程序 例: #!/bin/bash ti=date +%u 设置一个ti的变量 [ $ti -eq 6 -o $ti -eq 0 ] && wall hello 如果数字等于6会在0 会发送一个hello的广播 chmod +x f2.sh vim /etc/crontab 40 17 * * * root /root/f2.sh 星期六和星期日17点40执行f2.sh脚本,发送广播 例: #!/bin/bash ti=date +%u [ $ti -eq 6 -o $ti -eq 0 ] && wall hello vim /etc/crontab 40 17 1,10,20 * * root /root/f2.sh 每月的1号10号20号并且星期日和星期六17:40执行程序 例: vim /etc/crontab * * * * * root f2.sh root用户每分钟执行一次脚本 例: vim /etc/crontab 1 * * * * root f2.sh root用户每小时的第一分钟执行一次脚本 例:执行命令的间隔为秒 vim f3.sh md0执行 命令 leep 20 休眠20秒 md20 执行命令 leep 20 休眠20秒 md30执行 命令 vim /etc/crontab * * * * * root f3.sh 每20秒执行一次命令 usleep可以精确到微秒 1000000微秒等于一秒 @monthly root /root/f2.sh 每月1号执行一次文件 @reboot root /root/f2.sh 当重启的时候执行某个操作 @hourly 一小时执行一次 @daily 一天执行一次 @weekly 一周执行一次 @monthly 一月执行一次 @annually 一年执行一次 cat /var/log/cron 日志记录了当前发生的事件 每个单用户创建任务计划用 crontab crontab -e 要创建计划任务 * * * * * wall hello 每分钟广播一次 不需要写用户名 cat /var/spool/cron 计划任务放在这个文件,在root用户下可以查看和修改 在root用户编辑普通用户的计划任务 crontab -l -u wang 查看wang用户的计划任务 crontab -e -u wang 编辑wang用户的计划任务 crontab -r -u wang 删除wang用户的计划任务 单用户的白名单和黑名单 白名单 :/etc/cron.allow 默认不存在,要创建,将用户加入白名单 黑名单 :/etc/cron.deny 默认存在将用户写入文件,用户就不能执行任务计划 在cron里面的%号有特殊含义,不能直接使用,写在脚本里面直接调用 练习题 1、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz” ,其中日期是前一天的时间 vim time.sh #!/bin/bash date -d “-1 day” +%F-%H chmod +x time.sh vim /etc/crontab 05 21 * * * root tar Jcvf /data/etcbak-. time.sh.tar.xz /etc/ 2、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至 /tmp/meminfo.txt文件中 * */2 * * * cat /proc/meminfo |egrep “^(S|M)” >> /tmp/meminfo.txt 3、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高 于80%,就执行wall警报 vim disk.sh #!/bin/bash disk1=df |grep "sd" |sed -r "s/.*[ ]+([0-9]{1,3}).*/\1/" |sort -nr |head -n1 disk2=df -i |grep "sd" |sed -r "s/.*[ ]+([0-9]{1,3}).*/\1/" |sort -nr |head -n1 [ $disk1 -ge 80 -o $disk2 -ge 80 ] && wall Disk over 80% vim /etc/crontab */10 * * * 1-5 root disk.sh