概述
接着之前的Linux系列篇,第二篇主要介绍进程和服务,从进程到服务,由浅入深的知识系统的介绍。
进程、程序和服务
Linux系统只认识二进制文件,那么当我们要让系统工作的时候,启动一个二进制文件,这个二进制文件就是程序。
程序一般放置在屋里磁盘中,然后通过用户的执行来触发,触发后会加载到内存中称为一个个体,那就是进程。
为了让操作系统可以管理这个进程,进程会给予执行者权限/属性等参数,以及进程所需的脚本或数据等,最后在给予一个PID。
我们将它在后台启动并一直持续不断地运行,常驻在内存当中的进程,被我们称为服务。
任务管理(job control)
有时我们想把服务放入后台执行,有多种办法,下面利用后台管理任务和数据流,把输出的信息都重定向到/tmp/log.txt
文件中,96就是这次进程执行的PID。
[root@57926ad08c2f /]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
[1] 96
1.查看目前后台的任务状态
jobs 参数
- -l: 除了列出Job number与命令串之外,同时列出PID的号码
- -r: 仅列出正在后台的run的任务
- -s:仅列出正在后台当中暂停的任务
# jobs -l
[1] 96 Done tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1
2.将后台任务拿到前台来处理 fg
代码语言:bash复制[root@57926ad08c2f /]# vim /run.sh &
[1] 98
[root@57926ad08c2f /]# jobs -l
[1] 98 Stopped (tty output) vim /run.sh
[root@57926ad08c2f /]# fg %1
vim /run.sh
[root@57926ad08c2f /]#
3.让任务在后台下的状态变成运行中 bg
4.管理后台当中的任务 kill
kill的使用语法kill -signal %jobnumber
,使用kill -l
来查看信号的列表,我们只介绍最常用的命令:
- -1 : 重新读取一次参数的配置文件
- -2 : 代表由键盘输入ctrl c同样的操作
- -9 : 立刻强制删除一个任务
- -15 : 以正常的进程方式终止一项任务,与-9是不一样的
[root@57926ad08c2f /]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN 1 36) SIGRTMIN 2 37) SIGRTMIN 3
38) SIGRTMIN 4 39) SIGRTMIN 5 40) SIGRTMIN 6 41) SIGRTMIN 7 42) SIGRTMIN 8
43) SIGRTMIN 9 44) SIGRTMIN 10 45) SIGRTMIN 11 46) SIGRTMIN 12 47) SIGRTMIN 13
48) SIGRTMIN 14 49) SIGRTMIN 15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
进程管理
进程管理最好用的三个命令分别是ps aux 、ps axjf 、pstree
,它们都是查看系统进程里很高效的工具。
- ps aux : 查看所有的系统进程
- ps axjf :列出类似进程树的进程显示,以下面的php-fpm为例
[root@cc ~]# ps axjf | grep php
1 1573 1573 1573 ? -1 Ss 0 8:35 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
1573 8530 1573 1573 ? -1 S 99 0:01 _ php-fpm: pool www
1573 8574 1573 1573 ? -1 S 99 0:00 _ php-fpm: pool www
1573 8611 1573 1573 ? -1 S 99 0:00 _ php-fpm: pool www
8850 9209 9208 8850 pts/1 9208 S 0 0:00 _ grep --color=auto php
- pstree 也是一个超级好用的命令,pstree如果不存在,需要使用
yum install -y pstree
安装。
[root@cc ~]# pstree -pua | grep php
|-php-fpm,1573
| |-php-fpm,8713,nobody
| |-php-fpm,8715,nobody
| | |-grep,9415 --color=auto php
僵尸进程
僵尸进程,僵尸进程的原因在于该进程应该已经执行完毕,或是应该终止了,但是该进程的父进程却无法完整的该进程结束掉,而造成该进程一直存在于内存当中。
如果发现在某个cmd后面接上<defunct>
时,就代表该进程一直存在于内存当中。
系统不稳定的时候就容易造成所谓的僵尸进程,记得要找出该进程的父进程,然后好好追踪进行主机的环境优化,看看有什么地方需要改善,不要只是直接的kill掉。
查看系统的资源信息
这里我们介绍两个常用的命令,free
和netstat
。
1.查看系统内存资源 free
free 参数详解:
- -b: 直接输入free时,显示的单位是KBytes,我们可以使用b或者m
- -t: 在输出的最终结果,显示物理内存与swap的总量
- -s: 可以让系统不断刷新数据,20秒刷新数据的命令是
free -m -s 20
2.追踪网络或socket文件
- -a: 将目前系统上所有的连接、监听、socket信息都列出来。
- -t: 列出tcp网络包的信息。
- -u: 列出udp网络包的信息。
- -l: 列出目前正在网络监听的服务。
- -p: 列出该网络服务进程的PID。
比如统计服务器上的连接数,18101和3306是端口号
代码语言:bash复制netstat -ant|grep ESTABLISHED| wc -l;
netstat -ant|grep ESTABLISHED|grep 18101 |wc -l;
netstat -ant|grep ESTABLISHED|grep 3306 | wc -l
服务
早期System V的init管理操作系统
使用init管理服务,所有的服务启动脚本放置于/etc/ini.d/
目录,基本上都是使用bash shell所写成的脚本程序,要想到lnmp的一键安装包(现在也感觉lnmp超级方便),以服务器上的Nginx和php为例:
[root@cc ~]# /etc/init.d/nginx
Usage: /etc/init.d/nginx {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}
[root@cc ~]# /etc/init.d/php
Usage: /etc/init.d/php {start|stop|restart}
制定运行级别默认要启动的服务,以Nginx服务为例
- chkconfig nginx on : 默认启动
- chkconfig nginx off :默认不启动
- chkconfig --list nginx : 查看默认启动状态
systemd 使用的unit分类
从CentOs7.X以后,服务管理从init转向到systemd的方式,一般来说服务的启动有两个阶段,一个是开机要不要启动服务,一个是现在要不要启动这个服务。
systemctl cmd
- start : 立刻启动后面的unit
- stop: 立刻关闭后面的unit
- restart : 立刻重启后面的unit,立即执行stop,再start的意思
- reload : 不关闭后面接的unit的情况下,重新加载配置文件,让设置生效
- enable : 设置下次开机时,后面接的unit会被启动
- disenable : 设置下次开机时,后面的unit不会被启动
- status : 查看unit的状态
- is_active: 目前有没有正在进行中
- is_enable: 开机时有没有默认要启动这个unit