linux - 进程和服务(上篇)

概述

接着之前的Linux系列篇,第二篇主要介绍进程和服务,从进程到服务,由浅入深的知识系统的介绍。

进程、程序和服务

Linux系统只认识二进制文件,那么当我们要让系统工作的时候,启动一个二进制文件,这个二进制文件就是程序

程序一般放置在屋里磁盘中,然后通过用户的执行来触发,触发后会加载到内存中称为一个个体,那就是进程

为了让操作系统可以管理这个进程,进程会给予执行者权限/属性等参数,以及进程所需的脚本或数据等,最后在给予一个PID。

我们将它在后台启动并一直持续不断地运行,常驻在内存当中的进程,被我们称为服务

任务管理(job control)

有时我们想把服务放入后台执行,有多种办法,下面利用后台管理任务和数据流,把输出的信息都重定向到/tmp/log.txt文件中,96就是这次进程执行的PID。

bash 复制代码
[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:仅列出正在后台当中暂停的任务
bash 复制代码
# 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是不一样的
bash 复制代码
[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为例
bash 复制代码
[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安装。
bash 复制代码
[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掉。

查看系统的资源信息

这里我们介绍两个常用的命令,freenetstat

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为例:

bash 复制代码
[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] [unit]

  • start : 立刻启动后面的unit
  • stop: 立刻关闭后面的unit
  • restart : 立刻重启后面的unit,立即执行stop,再start的意思
  • reload : 不关闭后面接的unit的情况下,重新加载配置文件,让设置生效
  • enable : 设置下次开机时,后面接的unit会被启动
  • disenable : 设置下次开机时,后面的unit不会被启动
  • status : 查看unit的状态
  • is_active: 目前有没有正在进行中
  • is_enable: 开机时有没有默认要启动这个unit
相关推荐
一切皆是定数41 分钟前
Linux驱动开发——LED驱动开发
linux·驱动开发·b树
小小不董43 分钟前
图文深入理解Oracle DB Scheduler
linux·运维·服务器·数据库·oracle
Amagi.1 小时前
Spring中Bean的作用域
java·后端·spring
2402_857589361 小时前
Spring Boot新闻推荐系统设计与实现
java·spring boot·后端
J老熊1 小时前
Spring Cloud Netflix Eureka 注册中心讲解和案例示范
java·后端·spring·spring cloud·面试·eureka·系统架构
Benaso1 小时前
Rust 快速入门(一)
开发语言·后端·rust
sco52821 小时前
SpringBoot 集成 Ehcache 实现本地缓存
java·spring boot·后端
不烦下雨c1 小时前
[网络]抓包工具介绍 tcpdump
linux·tcpdump
原机小子2 小时前
在线教育的未来:SpringBoot技术实现
java·spring boot·后端
吾日三省吾码2 小时前
详解JVM类加载机制
后端