进程管理
首先我们要知道进程管理的目的:
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。所以我们只需要将命令放入对应的文件中,其实就能达到定时任务的目的。
