进程和计划任务管理

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> <EOT> Ctrl+d 结束

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> <EOT> ctrl+d结束

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 <<end

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> <EOT>     Ctrl+d 结束

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> <EOT> ctrl+d结束

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 <<end

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