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进程管理的主要内容,如果未能解决你的问题,请参考以下文章

linux c 退出进程的代码

Linux进程管理

Linux系统管理10——进程和计划任务管理

Linux中的进程管理

Linux进程和计划任务管理

Linux进程和任务管理