大家好,欢迎来到IT知识分享网。
进程管理
一、进程基础知识
程序 :
二进制文件,静态 /usr/sbin/httpd,/usr/sbin/sshd
进程 :
是程序运行的过程, 动态,有生命周期的,可以产生和消亡的(进程是已启动的可执行程序的运行
实例,实例即运行可执行程序)。
线程 :
线程是进程之内独立执行的一个单元。对于操作系统而言,其调度单元是线程;一个进程至少包括
一个线程,通常将该线程称为主线程;一个进程从主线程的执行开始,进而创建一个或多个附加线程,就
是所谓基于多线程的多任务。
进程的生命周期
父进程:
程序运行时产生的第一个进程,任何进程都可以作为父进程创建子进程。
子进程:
由父进程使用fork()函数完全复制自己的地址空间创建出来的新的进程就是子进程,子进程继承父
进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码,随后,子进
程可能exec自己的程序代码。
poccess id:
为父进程跟踪和安全性以及管理人员的控制和管理所需,父进程会给子进程分配一个唯一的
进程id,这个id就是pid
进程状态
R:
包含runnable和running,表示进程正在等待运行或者是正在cpu上运行
Sleeping: 包含S、D、K三种状态
S:
可中断睡眠,进程在等待事件触发/接收到指定的信号(硬件请求/系统之间的访问)才会运行起
来。
D:
不可中断睡眠,不会接收或者是相应外界传来的信号,通常情况下正在进行I/O操作
K:
和D的状态相同,但是可以被中断
Stopped:
T状态,表示进程被停止,通常是由用户或者是其他进程发送的信号。
Zombie:
包含X、Z两种状态
Z:
除了pid之外,其他的资源都已经释放掉,给父进程发送退出信号之后进入到Z状态
X:
父进程清理掉子进程剩余的结构体之后,子进程就进入到死亡的状态
二、查看进程
==静态ps
[root@ever ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 2164 648 ? Ss 08:47 0:00 /usr/lib/systemd/systemd 56/214 USER: 运行进程的用户 PID: 进程ID %CPU: CPU占用率 %MEM: 内存占用率 VSZ: 占用虚拟内存,包括程序、代码、共享库等所有的 RSS: 占用实际内存 驻留内存 TTY: 进程运行的终端,?表示不依赖于任何的终端 STAT: 进程状态 R 运行 S 可中断睡眠 Sleep D 不可中断睡眠 T 停止的进程 Z 僵尸进程 X 死掉的进程
【了解 】
Ss s进程的领导者,父进程 S< <优先级较高的进程 SN N优先级较低的进程 R+ +表示是前台的进程组 Sl 以线程的方式运行 START: 进程的启动时间 TIME: 进程占用CPU的总时间,单位是minute COMMAND: 进程文件,进程名 ps aux --sort rss |less //升序排序 ps aux --sort -rss |less //降续排序
自定义显示字段
[root@ever ~]# ps axo user,pid,ppid,%mem,command [root@ever ~]# ps axo user,pid,ppid,%mem,command |grep bash alice 29371 29353 0.3 -bash root 30314 2677 0.3 bash root 31443 2677 0.3 bash root 31457 31443 0.1 grep bash [root@ever ~]# ps -ef //unix风格 UID PID PPID C STIME TTY TIME CMD root 1 0 0 08:47 ? 00:00:00 init [5]
查看指定进程的PID
[root@ever ~]# ps aux |grep sshd root 10180 0.0 0.0 7224 1024 ? Ss 16:00 0:00 /usr/sbin/sshd [root@www ~]# man pgrep 57/214 [root@ever ~]# pgrep -l sshd //不加l就不显示进程的名字 10180 sshd [root@ever ~]# pgrep sshd 10180 [root@www ~]# pgrep -uroot sshd 10180 [root@www ~]# pgrep -uapache,root [root@ever ~]# cat /var/run/sshd.pid 10180 [root@ever ~]# pidof sshd 10180
==动态top
[root@ever ~]# top [root@ever ~]# top -d 1 一秒钟变化一次 [root@ever ~]# top -d 1 -p 10126 查看指定进程的动态信息 [root@ever ~]# top -d 1 -p 1,2,3 查看sshd的同时查看pid号为1的进程 [root@ever ~]# top -d 1 -u qemu 查看指定用户的进程 [root@ever ~]# top -b -n 2 > top.txt 将2次top信息写入到文件
第一部分:系统整体统计信息
top - 14:22:36 up 4:45, 3 users, load average: 0.00, 0.00, 0.00 Tasks: 206 total, 2 running, 204 sleeping, 0 stopped, 0 zombie Cpu(s): 1.6%us, 0.7%sy, 0.0%ni, 96.8%id, 0.9%wa, 0.0%hi, 0.0%si, 0.0%st Mem: k total, k used, k free, k buffers Swap: k total, 0k used, k free, k cached load average: 0.23, 0.06, 0.02 1分钟,5分钟,15分钟之内系统的平均负载 us:用户占用的cpu的百分比 sy:内核占用的cpu的百分比 ni 改变过优先级的进程占用的cpu的百分 比 id:cpu的空闲时间 wa:cpu的IO等待的时间 hi:硬中断占用的cpu的百分比 si:软中断 st:cpu被偷走的时间
第二部分:进程信息
命令 h或?获得帮助 M 按内存的使用排序 P 按CPU使用排序 N 以PID的大小排序 R 对排序进行反转 f 自定义显示字段,调整字段顺序(选中正行上下箭头调整) 1 显示所有CPU的负载 W 保存top环境设置 ~/.toprc < 向前 > 向后 一页显示不了,向后翻页 z 彩色 [root@localhost ~]# atop [root@localhost ~]# htop
三、使用信号控制进程
[root@ever ~]# kill -l //列出所有支持的信号 编号 信号名 1) SIGHUP 重新加载配置 2) SIGINT 键盘中断^C 3) SIGQUIT 键盘退出^\ 9) SIGKILL 强制终止,不可忽略,不可拦截 15) SIGTERM 终止(正常退出,干净)默认信号,可忽略 18) SIGCONT 继续,不可拦截 19) SIGSTOP 停止,不可忽略 20)SIGTSTP 暂停^Z
练习1:
给sshd/httpd进程发送1,15信号
[root@ever ~]# ps aux |grep sshd root 1925 0.0 0.0 64116 44 ? Ss Jul25 0:00 /usr/sbin/sshd [root@ever ~]# kill -hup 1925 [root@ever ~]# ps aux |grep sshd root 32701 0.0 0.2 64116 1144 ? Ss 19:27 0:00 /usr/sbin/sshd [root@ever ~]# service sshd reload [root@ever ~]# ps aux |grep httpd root 8849 0.0 0.0 4216 ? Ss 04:55 0:00 /usr/sbin/httpd apache 8852 0.0 0.0 2464 ? S 04:55 0:00 /usr/sbin/httpd ... [root@ever ~]# kill -1 8849 //发送重新加载信号 [root@ever ~]# ps aux |grep httpd root 8849 0.0 0.0 7224 1028 ? Ss 15:42 0:00 /usr/sbin/httpd apache 8878 0.0 0.0 2520 ? S 04:56 0:00 /usr/sbin/httpd ... [root@ever ~]# vim /etc/httpd/conf/httpd.conf [root@ever ~]# kill -1 8849 [root@ever ~]# ps aux |grep httpd [root@ever ~]# kill 8849 //发送停止信号 [root@ever ~]# ps aux |grep sshd root 9953 0.0 0.0 4264 676 pts/1 R+ 15:44 0:00 grep sshd
练习2:
给vim进程发送9,15信号
[root@ever ~]# touch file1 file2 [root@ever ~]# tty /dev/pts/1 [root@ever ~]# vim file1 [root@ever ~]# tty /dev/pts/2 [root@ever ~]# vim file2 [root@ever ~]# ps aux |grep vim root 4362 0.0 0.2 11104 2888 pts/1 S+ 23:02 0:00 vim file1 root 4363 0.1 0.2 11068 2948 pts/2 S+ 23:02 0:00 vim file2 [root@ever ~]# kill 4362 [root@ever ~]# kill -9 4363 [root@ever ~]# killall vim //给所有vim进程发送信号 [root@ever ~]# killall httpd
练习3:
给sshd进程发送18,19信号
[root@ever ~]# ps aux |grep sshd root 5571 0.0 0.0 64064 1164 ? Ss 09:35 0:00 /usr/sbin/sshd [root@ever ~]# kill -STOP 5571 [root@ever ~]# ps aux |grep sshd root 5571 0.0 0.0 64064 1164 ? Ts 09:35 0:00 /usr/sbin/sshd [root@ever ~]# kill -cont 5571 [root@ever ~]# ps aux |grep sshd root 5571 0.0 0.0 64064 1164 ? Ss 09:35 0:00 /usr/sbin/sshd
练习4:
踢出一个从远程登录到本机的用户
[root@ever ~]# pkill --help [root@ever ~]# pkill -u alice [root@ever ~]# ssh root@172.16.110.1 //别人服务器的IP [root@ever ~]# sleep 1000 //执行完命令之后,将这个终端放在这里不要动 重新打开另外一个终端,执行w命令 [root@localhost ~]# w 04:42:24 up 13:22, 4 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 172.16.110.245 04:41 5.00s 0.00s 0.00s sleep 1000 root tty1 :0 Fri08 4days 47.16s 47.16s /usr/bin/Xorg : root pts/1 :0.0 Mon04 0.00s 0.06s 0.00s w root pts/2 :0.0 Mon04 24:25m 0.00s 0.00s bash [root@localhost ~]# pkill -t pts/3 //只是杀掉终端上的进程 [root@localhost ~]# pkill -9 -t pts/3 //连终端都一起杀掉了 查看踢出去的效果 [root@ever ~]# sleep 1000 Connection to 172.16.110.1 closed
四、进程的优先级
Linux 进程调度及多任务
每个CPU在一个时间点上只能处理一个进程,而Linux实际能够运行的进程数远远超出实际可用的
CPU核心数量,这是因为有时间片技术。Linux内核进程调度程序将多个进程在CPU核心上快速切换,从而
给用户多个进程在同时运行的印象。
相对优先级 nice
由于每个进程的重要性不同,所以他们被分到的cpu时间片也不同,这取决于进程的优先级,优先级
有很多种,使用什么样的优先级取决于内核采用的不同的调度策略,进程调度程序(cfq)会为不同的进程
使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略为 SCHED_OTHER (也称为
SCHED_NORMAL),只有这种调度策略运行的进程的相对优先级称为进程的 nice 值,可以有40种不同级
别的nice值。优先级越高,进程更不倾向与让出CPU;nice值越高,优先级越低,进程更容易将cpu使用量
让给其他进程。
查看进程的nice级别
1.使用top命令查看
NI: 实际nice级别
PR: 将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39
2.使用ps命令查看
[root@ever ~]# ps axo pid,command,cls,nice --sort=-nice
TS 表示该进程使用的调度策略为SCHED_OTHER
启动不同nice级别的进程
启动进程时,通常会继承父进程的 nice级别,默认为0。
[root@ever ~]# nice -n -5 sleep 6000 & //程序运行时设置优先级,并且将进程放到后台运 行,不占用当前终端 [root@ever ~]# ps axo command,pid,nice |grep sleep
更改已经运行进程的nice值
1.使用top命令更改nice级别
r 调整进程的优先级(Nice Level) (-20高) ---0--- (19低)
2.使用shell更改nice级别
[root@ever ~]# sleep 1000 & [1] 7412 [root@ever ~]# renice -20 7412 //对已运行的进程设置新的优先级 7412: old priority 0, new priority -20
五、作业控制
作业控制是一个命令行功能,可以允许一个shell实例来运行和管理多个进程。
如果没有作业控制,父进程fork()一个子进程后,将进入sleeping状态,直到子进程退
出。
使用作业控制可以选择性暂停、恢复以及异步运行进程,让shell可以在子进程运行期
间返回接受其他命令
进程前台、后台
前台:前台进程会占用当前终端,当前终端为该进程的控制终端,进程会接收键盘产生的
输入信号
后台:后台进程没有控制终端,不需要终端的交互,不接收终端输入的信号
[root@ever ~]# vim /etc/hosts //^Z,将前台的这个进程调到后台且处于停止的状态 [1]+ Stopped vim /etc/hosts [root@ever ~]# sleep 3000 & //运行程序(时),让其在后台执行 [2] 8735 [root@ever ~]# sleep 2000 //^Z,将前台的程序挂起(暂停)到后台 [root@ever ~]# ps aux |grep sleep 62/214 root 8895 0.0 0.0 556 pts/0 S 12:13 0:00 sleep 3000 root 8896 0.0 0.0 556 pts/0 T 12:13 0:00 sleep 2000 [root@ever ~]# jobs //查看后台作业 [1]+ Stopped vim /etc/hosts [2] Running sleep 2000 & [3]- Running sleep 3000 & [root@ever ~]# fg //调回最近使用的命令,带“+”号的 [root@ever ~]# bg %2 //让作业2在后台运行 [root@ever ~]# fg %1 //将作业1调回到前台 [root@ever ~]# kill %1 //kill 1,杀死PID为1的进程 这些本身都是进程,但是在同一个终端中我们可以把他们看成是作业,且作业只在当前终端生效
企业案例1:
[root@www ~]# while : ; do date ; sleep 2 ; done [root@www ~]# while : ; do date ; sleep 2 ; done & [root@www ~]# (while : ; do date ; sleep 2 ; done) &> /dev/null [root@www ~]# (while : ; do date ; sleep 2 ; done) &> /dev/null & &放在命令的最后面才表示后台符
企业案例2:
[root@ever ~]# ssh 172.16.50.240 [root@client ~]# yum -y install screen [root@client ~]# screen -S install_apache //为接下来的操作起个名字 ==断网后,重新连接== [root@client ~]# screen -list There are screens on: 28958.install_nginx (Detached) 29013.install_apache (Detached) 2 Sockets in /var/run/screen/S-root. [root@client ~]# screen -r 29013
六、管理网络进程
ports and services
网络服务是通过socket的方式提供服务的,使用ss命令查询常用的选项
[root@www ~]# ss --help -n 不解析服务的名字 -a 显示所有套接字 -l 显示监听(Listen)的端口 -t 显示tcp的套接字或者是服务 -u 显示udp的套接字或者是服务 -p 显示进程的名字
1、Show TCP sockets(LISTEN)
[root@www ~]# ss -t //tcp的套接字 [root@www ~]# ss -tl //监听的服务,状态是listen的 [root@www ~]# ss -tnl //不显示协议名 [root@www ~]# ss -tnlp //显示服务名 [root@www ~]# ss -ant //查看所有状态的,包括监听和建立连接的,此时无需l 选项。 [root@www ~]# ss -ant |grep :5900 [root@www ~]# ss -ant |grep :80 [root@www ~]# ss -ant |grep :22 [root@www ~]# ss -ant |grep :21
2、Show UDP sockets(所有状态)
udp的协议比较少
[root@www ~]# ss -anu
七、proc文件系统
虚拟的文件系统:内核、进程运行的状态信息,存放的大多是进程相关的目录
[root@ever ~]# ll -dh /proc/ dr-xr-xr-x 208 root root 0 9月 30 08:08 /proc/ [root@ever ~]# du -sh /proc/ 0 /proc/
/proc/cpuinfo
[root@ever ~]# less /proc/cpuinfo //查看cpu相关的信息 [root@ever ~]# grep 'processor' /proc/cpuinfo //查看逻辑cpu的个数 processor : 0 //0号处理器 processor : 1 [root@ever ~]# grep 'physical' /proc/cpuinfo //查看物理cpu的个数 physical id : 0 address sizes : 36 bits physical, 48 bits virtual physical id : 0 address sizes : 36 bits physical, 48 bits virtual [root@localhost ~]# cat /proc/cpuinfo | grep --color lm //支持64位系统(length mode) [root@localhost ~]# cat /proc/cpuinfo | grep --color vmx //是否支持intel的硬件虚拟化 [root@localhost ~]# cat /proc/cpuinfo | grep --color svm //是否支持AMD的硬件虚拟化 [root@ever shell]# lscpu //将cpuinfo文件归类显示 Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 2 Core(s) per socket: 2 Socket(s): 1 //1个插槽即1路的处理器
/proc/meminfo
[root@ever 桌面]# cat /proc/meminfo [root@ever 桌面]# free -m total used free shared buffers cached Mem: 7757 2314 5443 0 90 1586 -/+ buffers/cache: 637 7119 Swap: 4095 0 4095
/proc/cmdline
当前启动系统之后内核生效的参数
[root@ever 桌面]# cat /proc/cmdline //内核参数 ro root=UUID=59fe9aaf-21c7-4451-9d21-584aec rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
系统负载
[root@ever 桌面]# uptime 09:00:52 up 5:15, 2 users, load average: 0.15, 0.09, 0.08
查看/proc的挂载
[root@ever ~]# mount
将/proc卸载掉
[root@ever ~]# umount /proc/ -l [root@ever ~]# free -m Error: /proc must be mounted To mount /proc at boot you need an /etc/fstab line like: /proc /proc proc defaults In the meantime, run "mount /proc /proc -t proc" [root@ever ~]# uptime Error: /proc must be mounted To mount /proc at boot you need an /etc/fstab line like: /proc /proc proc defaults In the meantime, run "mount /proc /proc -t proc" [root@ever ~]# lscpu centos7 baseurl=ftp://172.16.8.100/centos7u2/ enabled=1 lscpu: cannot open /proc/cpuinfo: 没有那个文件或目录 [root@ever ~]# top top: /proc is not mounted, required for output data
重新挂载proc文件系统
[root@ever ~]# mount -t proc proc /proc/ -t 指定文件系统类型 proc 文件系统,虚拟的文件系统 /proc挂载点
修改内核参数
[root@localhost ~]# echo 1 > /proc/sys/vm/drop_caches 释放内存 1 buffer 2 cache 3 buffer和cache [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 是否开启路由转发功能
配置文件
[root@localhost ~]# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 net.ipv4.conf.all.rp_filter=0 net.ipv4.conf.default.rp_filter=0
注释:
rp_filter即reverse-pathfiltering,反向过滤技术,系统在接收到一个IP包后,检查该IP是不是合乎要求,不
合要求的IP包会被系统丢弃。
[root@localhost ~]# sysctl -p //刷新内核参数
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/131672.html