linux进程管理
Posted Qiao_Zhi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux进程管理相关的知识,希望对你有一定的参考价值。
0.进程处理方式
standalone 独立运行
xinetd 进程托管
atd、crond计划任务
(1)独立运行:
一直在独立运行,比如apache、nginx服务器,一直在监听80端口的请求,有了请求可以马上响应,由于一直在监听所以一直在占用CPU资源。服务启动后一直在系统驻留,等待客户访问并能很快应答。
[root@VM_0_12_centos ~]# netstat -ano | grep "LISTENING" |more #查看监听状态的端口 unix 2 [ ACC ] STREAM LISTENING 9471 /run/systemd/private
(2)xinetd 托管进程
不会一直在系统中驻留,会交给xinetd托管,当有请求的时候xinetd调用进程。占用资源少,但是响应时间也慢。
(3)atd、crond计划任务 就是定期定时执行任务
没有办法精确到秒,因为at,crond执行任务的时候不像standalone一直在监听请求,也不会像xinetd有请求就启动进程回应,它们的处理方式是每隔一分钟醒来一次查看计划任务列表中是否有计划,有就执行,没有就继续休眠。
1.进程和程序的区别
程序是经验概念,本身作为一种软件资源长期保存,而进程是程序是执行过程,它是动态概念,有一定的生命周期,是动态产生和消亡的。
程序和进程无一一对应关系,一个程序可以由多个进程共有;另外,一个进程在活动中可以有序的执行若干个程序。
2.父进程和子进程的概念
1.子进程是一个由父进程所产生的进程,产生这个子进程的进程成为父进程。
2.在linux中,系统使用fork创建进程。fork复制的内容包括和堆栈段以及父进程的进程环境
3.父进程终止子进程自然终止。
如果父进程终止,死了子进程没死,这种进程成为孤儿进程,子进程的父进程ID会自动指向init进程(PID为0)
如果子进程死亡,父进程存活,这种进程称为僵尸进程。
3.前台进程和后台进程:
前台进程:在shell中输入一条命令,创建一个子进程,运行命令,shell等待命令退出,然后返回给用户提示。这条命令与shell异步运行,用户 在完成之前不能执行另一条命令。例如如下命令,在没有给出结果之前我们不能执行其他操作:
[root@VM_0_12_centos ~]# find / -name init
后台进程:在shell提示处打出命令,随后给一个&,shell创建的子进程运行此命令,但不等待命令退出,而直接返回到对童虎提示,这条命令与shell命令同步运行,即在后台运行。后台进程是非交互式的。例如我们可以将上面查找命令后面加一个&标识符,并将结果重定向到一个文件中,这个进程就是后台进程:
[root@VM_0_12_centos ~]# find / -name init > ./test.find &
4.进程状态:
4.进程状态查看的命令: ps
ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。
ps(选项)
常用选项:
a:显示所有用户的进程
u:显示用户名和启动时间
x:显示没有控制终端的进程
e:显示所有进程,包括没有控制终端的进程
l:采用详细的格式来显示程序状况。
w:宽行显示,可以使用多个w进程宽行显示。
例如:
(1)查看属于当前用户自己的进程信息:
[root@VM_0_12_centos ~]# ps PID TTY TIME CMD 5819 pts/0 00:00:00 bash 6493 pts/0 00:00:00 ps
(2)查看属于自己的进程详细信息: ps -l或者ps -u(一般用 ps -le 显示的信息更详细)
[root@VM_0_12_centos ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 5819 5817 0 80 0 - 29042 wait pts/0 00:00:00 bash 0 R 0 6499 5819 0 80 0 - 34343 - pts/0 00:00:00 ps
[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 3485 0.0 0.1 115508 2120 pts/0 Ss 12:12 0:00 -bash root 3509 0.0 0.1 115508 2084 pts/1 Ss 12:13 0:00 -bash root 3529 0.0 0.1 187520 2336 pts/1 S 12:13 0:00 su qlq root 3627 0.0 0.0 151052 1836 pts/0 R+ 12:13 0:00 ps -u root 30845 0.0 0.1 115380 2112 tty1 Ss+ Mar30 0:00 -bash
PID:进程ID
PPID:父进程ID
TTY:登录的终端(本地为tty,远程为pts)
STATE:进程当前状态
S:休眠,D:不可中断的休眠状态,R:运行状态,Z:僵死状态,T:停止状态。
NI:进程优先级
TIME:进程自启动以来占用cpu时间
CMD:进程的命令
USER:用户名
%CPU:占用CPU时间和总时间的百分比
%MEM:占用内存和系统总内存的百分比
(3)查看所有用户执行的进程的详细信息:ps -le 显示的是UID或者 ps -aux 会显示进程的所属用户名字,最好加more分页显示:
[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -aux | more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 43252 3432 ? Ss Mar29 0:07 /usr/lib/syste d/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ? S Mar29 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S Mar29 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< Mar29 0:00 [kworker/0:0H] root 7 0.0 0.0 0 0 ? S Mar29 0:00 [migration/0] root 8 0.0 0.0 0 0 ? S Mar29 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? R Mar29 0:08 [rcu_sched]
[root@VM_0_12_centos sshDemo]# ps -le | more F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 30759 ep_pol ? 00:00:42 systemd 1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd 1 S 0 3 2 0 80 0 - 0 smpboo ? 00:00:10 ksoftirqd/0
(4)一般使用是加管道过滤:(例如查看和apache的httpd相关进程)
[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -aux | grep http root 977 0.0 0.2 226224 5184 ? Ss Mar29 0:03 /usr/sbin/httpd -DFOREGROUND qlq 4919 0.0 0.0 112644 968 pts/1 R+ 12:17 0:00 grep --color=au to http apache 14260 0.0 0.1 226360 3744 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 14261 0.0 0.1 226360 3748 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 14262 0.0 0.1 226360 3748 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 14263 0.0 0.1 226360 3748 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 14264 0.0 0.1 226360 3740 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 31451 0.0 0.1 226360 3748 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND apache 31509 0.0 0.1 226360 3748 ? S Mar30 0:00 /usr/sbin/httpd -DFOREGROUND
(5)如果希望按某一顺序排序:
[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -le --sort pid | more #按pid排序 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 10813 ep_pol ? 00:00:07 systemd 1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd 1 S 0 3 2 0 80 0 - 0 smpboo ? 00:00:00 ksoftirqd/0 1 S 0 5 2 0 60 -20 - 0 worker ? 00:00:00 kworker/0:0H 1 S 0 7 2 0 -40 - - 0 smpboo ? 00:00:00 migration/0 1 S 0 8 2 0 80 0 - 0 rcu_gp ? 00:00:00 rcu_bh
(6)查看某一用户的进程:
[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ ps -uU qlq #查看qlq用户的进程信息 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND qlq 3530 0.0 0.1 115380 2108 pts/1 S 12:13 0:00 bash qlq 5806 0.0 0.0 151052 1832 pts/1 R+ 12:20 0:00 ps -uU qlq
(7)查看系统的进程树信息: pstree
[qlq@iz2ze46xi6pjjj69ailg9lz ~]$ pstree #查看进程树 systemd─┬─AliYunDun───15*[{AliYunDun}] ├─AliYunDunUpdate───3*[{AliYunDunUpdate}] ├─aliyun-service ├─atd ├─auditd───{auditd} ├─crond ├─dbus-daemon ├─httpd───7*[httpd] ├─java───27*[{java}] ├─login───bash ├─miniserv.pl ├─mysqld_safe───mysqld───23*[{mysqld}] ├─ntpd───ntpd ├─polkitd───5*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─sshd─┬─sshd───bash───su───bash───pstree │ └─sshd───bash ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tmpnam_epbkCH ├─tuned───4*[{tuned}] ├─wipefs───5*[{wipefs}] └─wrapper─┬─java───13*[{java}] └─{wrapper}
5.进程杀死命令 kill
1. 为什么要杀死进程?
该进程占用了过多的cpu时间
该进程锁住了一个终端,其他嵌套进程无法运行。
运行时间过长但没有效果
产生了过多到屏幕或者磁盘文件的输出
无法正常退出程序。
2 kill用法:
kill pid 直接杀死进程
kill -9 pid 强制杀死进程
kill -1 pid 重启进程
killall 进程名 可以关闭所有进程名相同的进程
例如:
(1)查看httpd相关进程
[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd 4 S 0 977 1 0 80 0 - 56556 poll_s ? 00:00:03 httpd 5 S 48 14260 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14261 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14262 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14263 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14264 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 31451 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 31509 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd
(2)杀死pid为31509的进程:
[root@iz2ze46xi6pjjj69ailg9lz ~]# kill 31509 #杀掉pid为31509的进程 [root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd 4 S 0 977 1 0 80 0 - 56556 poll_s ? 00:00:03 httpd 5 S 48 14260 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14261 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14262 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14263 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14264 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 31451 977 0 80 0 - 56590 inet_c ? 00:00:00 httpd
(3)如果我们想杀死所有与httpd相关的进程,我们可以杀死其父进程,其父进程pid为977(父进程死亡,子进程也全部死亡)
[root@iz2ze46xi6pjjj69ailg9lz ~]# kill -9 977 #杀死PID为977的进程 [root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd 5 S 48 14260 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14261 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14262 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14263 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 14264 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd 5 S 48 31451 1 0 80 0 - 56590 inet_c ? 00:00:00 httpd
杀死其父进程我们发现其父进程ID自动转为1,也就是变成孤儿进程。等过一会又会自动死亡。
(4)killall 杀死名称相同的进程:
[root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd 4 S 0 11155 1 0 80 0 - 56556 poll_s ? 00:00:00 httpd 5 S 48 11157 11155 0 80 0 - 56556 inet_c ? 00:00:00 httpd 5 S 48 11158 11155 0 80 0 - 56556 inet_c ? 00:00:00 httpd 5 S 48 11159 11155 0 80 0 - 56556 inet_c ? 00:00:00 httpd 5 S 48 11160 11155 0 80 0 - 56556 inet_c ? 00:00:00 httpd 5 S 48 11161 11155 0 80 0 - 56556 inet_c ? 00:00:00 httpd [root@iz2ze46xi6pjjj69ailg9lz ~]# killall httpd #杀死名为httpd的进程 [root@iz2ze46xi6pjjj69ailg9lz ~]# ps -le | grep httpd
(5)/proc目录简介:
注意:
/proc存储的数据在内存镜像中,存的主要是进程的信息,每个数字对应的是PID的进程信息,也存放了系统的基本信息,数据是动态的:
[root@iz2ze46xi6pjjj69ailg9lz ~]# ls /proc/ 1 19 28 40 92 fb meminfo sysrq-trigger 10 2 2844 41 978 filesystems misc sysvipc 10277 212 2855 429 982 fs modules timer_list 10649 213 2865 452 997 interrupts mounts timer_stats 1085 232 2866 456 acpi iomem mtrr tty 11473 233 29 460 buddyinfo ioports net uptime 11912 234 3 5 bus irq pagetypeinfo version 12 235 30838 529 cgroups kallsyms partitions vmallocinfo 1213 2359 30845 532 cmdline kcore sched_debug vmstat 13 237 31993 60 consoles keys schedstat zoneinfo 1348 25 32063 7 cpuinfo key-users scsi 14 252 326 7366 crypto kmsg self 15 2533 344 8 devices kpagecount slabinfo 16 259 37 8072 diskstats kpageflags softirqs 1651 26 373 8075 dma loadavg stat 17 260 38 8838 driver locks swaps 18 27 39 9 execdomains mdstat sys
(6)查看服务进程号 pgrep 服务名称
[root@iz2ze46xi6pjjj69ailg9lz ~]# pgrep httpd 12678 12680 12681 12682 12683 12684
因此重启httpd服务变得很简单:
[root@iz2ze46xi6pjjj69ailg9lz ~]# kill -1 `pgrep httpd`
(7)pkill 服务名称 根据服务名称杀死所有相关进程:
[root@iz2ze46xi6pjjj69ailg9lz ~]# pkill httpd
(8)nice和renice指定进程优先级
(9)nohup命令 用户退出后仍继续执行命令
使用户退出登录后仍继续执行,nohup命令将执行后的数据和信息默认保存到文件nohup.out中
格式:
nohup program &
例如:我们想查询所有以conf结尾的文件,然后写到nohup.out文件中。(默认会写,如果加上重定向不会写。)
[root@VM_0_12_centos ~]# nohup find / -name *.conf &
6.进程的挂起和结束:
挂起:Ctrl+Z
终止: Ctrl +C
jobs 查看被挂起的进程
fg 恢复到前台继续执行
bg 恢复到后台执行
例如:
[root@VM_0_12_centos ~]# top #执行top命令 top - 13:17:14 up 11 days, 3:59, 1 user, load average: 0.44, 0.14, 0.12 Tasks: 89 total, 1 running, 88 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.2 sy, 0.0 ni, 99.0 id, 0.5 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1883844 total, 157056 free, 115172 used, 1611616 buff/cache KiB Swap: 0 total, 0 free, 0 used. 1569072 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 41104 3372 2192 S 0.0 0.2 0:38.78 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:10.07 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/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以上是关于linux进程管理的主要内容,如果未能解决你的问题,请参考以下文章