进程管理
首先我们要知道进程管理的目的:
1.判断服务器的健康状况
2.查看进程状态
3.杀死进程
当然杀死进程不是一个正常操作,不像在windows中打开任务管理器随便kill掉,杀死进程一般不是一个正常的退出方式,可能会导致某些问题。
我们按照顺序来说,如何查看进程的健康状态呢?
使用top命令:
top - 13:55:33 up 3 min, 2 users, load average: 0.18, 0.33, 0.16
Tasks: 351 total, 2 running, 349 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.7 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1001332 total, 732424 free, 123868 used, 145040 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 727740 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
316 root 20 0 0 0 0 S 0.7 0.0 0:04.60 kworker/0:3
2678 root 20 0 146276 2256 1420 R 0.3 0.2 0:00.26 top
1 root 20 0 44516 7128 2596 S 0.0 0.7 0:05.07 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.47 ksoftirqd/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.07 kworker/u256:0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/1
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/2
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/3
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/4
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/5
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/6
16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/7
top命令默认3秒刷新一次,windows的任务管理器是1秒刷新一次。
在这里我们可以看到进程的健康状况。
最主要的就是前面5行。
第一行,显示时间,开机了多久,多少个用户,5,10,15分钟之前对应的平均负载。
第二行,进程总数,正在运行进程数,休眠数,停止数,僵尸进程数。
第三行,us 用户空间占用CPU百分比 sy 内核空间占用CPU百分比 ni 用户进程空间内改变过优先级的进程占用CPU百分比 id 空闲CPU百分比 wa 等待输入输出的CPU时间百分比 hi 硬件中断 si 软件中断。这里我们主要看空闲CPU就可以了,也就是id。
第四行,内存空间。也是主要看的部分。
第五行,交换空间。
top是交互命令,可以使用h查看帮助手册。
查看进程的状态
ps aux或ps -le
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.3 0.7 44516 7144 ? Ss 13:52 0:05 /usr/lib/systemd/syste
root 2 0.0 0.0 0 0 ? S 13:52 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 13:52 0:00 [ksoftirqd/0]
root 6 0.0 0.0 0 0 ? S 13:52 0:00 [kworker/u256:0]
root 7 0.0 0.0 0 0 ? S 13:52 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 13:52 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 13:52 0:00 [rcuob/0]
root 10 0.0 0.0 0 0 ? S 13:52 0:00 [rcuob/1]
root 11 0.0 0.0 0 0 ? S 13:52 0:00 [rcuob/2]
root 12 0.0 0.0 0 0 ? S 13:52 0:00 [rcuob/3]
root 13 0.0 0.0 0 0 ? S 13:52 0:00 [rcuob/4]
root 14 0.0 0.0 0 0 ? S 13:52 0:00 [rcuob/5]
...
USER: 进程对应的用户
PID: 进程号,值得一说的是。/usr/lib/systemd/syste在centOs7中是第一个进程,它是所有进程的父进程。如果是centOs6,则是/bin/init。
%CPU: CPU使用率
%MEM: 内存使用率
VSZ: 虚拟内存使用
RSS: 实际内存使用
TTY: 终端号。tty1-6是本地终端号,tty7为本地图形终端号。远程终端号位pts/0-255。如果是?则代表这是系统进程
STAT: 进程状态,S表示休眠,s表示包含了子进程,R代表运行。T代表停止,+表示后台运行等等
START: 进程启动时间。
TIME: 耗费CPU的运算时间
COMMAND: 进程名称
使用ps -ls可以看到进程的优先级。
我们还可以使用pstree查看进程树。
[root@localhost ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─abrt-watch-log
├─abrtd
├─anacron
├─atd
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─login───bash
├─lsmd
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rngd
├─rsyslogd───2*[{rsyslogd}]
├─smartd
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─wpa_supplicant
就好像我们上面说的,systemd是所有进程的父进程,可以在这里查看到。
杀死进程
kill 信号 进程号
信号是什么呢?可以使用kill -l查看信号。
常用信号:
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号:
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)
也就是kill是发送信号的命令。
我们可以使用killall删除一系列进程:
killall [参数] [进程名]
我们还可以使用nice命令修改进程的优先级。
其实进程的优先级并不总是需要改变,这里了解一下就好了。
工作管理
工作其实也就是后台管理。因为查看后台的程序命令是jobs,所以一般叫做工作管理。
首先我们需要只要
1.后台任务一般是绑定终端的,在这个终端下进入后台的程序在其他终端是无法进行管理的。
2.放入后台的任务需要持续一段时间的,如果一放入后台就执行完,没什么意义。
3.需要交互的任务放入后台无法运行。因为需要交互的话,任务会进入阻塞状态,需要得到输入之后才会进入运行状态。而后台任务无法获得我们的输入。
那么如何放入后台呢?
1.在命令最后面加入 &。
2.执行过程中,使用ctrl+z放入后台。
两者有什么区别呢?使用&放入后台的程序,是运行状态,而使用ctrl+z的方式放入后台是挂起状态,不会执行。
我们可以使用jobs来查看后台的进程。例如:
[root@localhost ~]# jobs
[1]+ Stopped top
这样我们就能查看到后台的进程和他们对应的状态。
最前面的1是后台进程工作号。是后台任务的标识。
如何将后台进程恢复到前台:
fg 工作号
将挂起的进程恢复到执行状态:
bg 工作号
有时候我们希望一个后台进程不被终端绑定,希望他一直运行,怎么办呢?
第一个方法就是将进程变为守护进程。但这个方法我们不常用。
第二个方式就是使用nohup命令:
[root@localhost ~]# nohup top &
[1] 2699
这样就会脱离终端了。上面这个只是使用方法的实例,这样做终端知道top需要交互,会拒绝执行这个命令。因为没有意义
第三个方法是将服务卸载/etc/rc.local中,这样,每次开机都会开启这个后台进程。因为这是父进程开启的终端中打开的后台进程,所以相当于没有绑定终端。
定时任务
windows中也有定时任务,并且是图形界面的。
而Linux中则需要在终端中执行。
Linux中分为一次性定时任务和循环定时任务。
一次性定时任务
使用at命令:
at [参数] [时间]
at> 执行的指令
定时之后输入命令,按ctrl +d就可以退出了。
之后可以通过at查看定时任务列表。
可以在/etc/at.deny中设置不能使用at命令的用户。
循环定时任务
1.使用crontab命令。
crontab [选项]
选项
-e: 编辑任务
-l: 查询任务
-r: 删除当前用户所有任务
格式:
* * * * * command
第一个*:一小时当中第几分钟
第二个*:一天当中第几个小时
第三个*:一个月中第几天
第四个*:一年中第几个月
第五个*:一周中星期几
除此之外,我们需要知道几个符号
*: 代表任意时间
,: 代表不连续的时间
-: 代表连续时间
*/n: 代表隔n执行
例如:每隔10分钟执行:
*/10 * * * * * command
当然这种方式其实并不经常用。
系统提供了几个文件,方便我们的管理。
/etc/cron.{}提供了hourly,daily,weekly,monthly文件,只要我们将文件放置在对应的文件中,就会相对应的每小时,每天,每周,每个月执行。
这几个文件通过/etc/anacrontab来控制,我们来看下其中的内容:
[root@localhost ~]# vim /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
也就是说,他们会每天执行daily,每7天执行weekly,每${monthly}执行monthly。
所以我们只需要将命令放入对应的文件中,其实就能达到定时任务的目的。