Linux进程管理-基本概念和命令



进程的概念

Linux进程管理-基本概念和命令


Linux进程管理-基本概念和命令

父子进程有两种特殊的情况,如果父亲进程终止,子进程来说是正常终止的,但是如果父亲进程终止了子进程没有终止,子进程会变为孤儿进程,他的父亲进程会指向init进程。另外一种情况是子进程终止了,父亲进程不知道,这个时候子进程会变为僵尸进程。linux里面产生子进程都是通过fork来创建的。

Linux进程管理-基本概念和命令

前台进程简单来说就是可以在命令行上面输入一条命令

[[email protected] ~]# find / -name init查找以init开头的文件有哪些

这个命令一直在运行shell也一直在等待这个命令执行完毕退出才显示结果给出用户的提示。用户在这个命令执行完毕之前不能执行另外一个命令。

 

后台进程是在shell提示符输入命令以后,后面可以加上后台执行符

[[email protected] ~]# find / -name init >/init.find &

[1] 52883

这个时候可以看到,shell会产一个子进程来执行这个命令,不需要等这个命令执行的结果再退出执行另外一条命令。上面命令是放在后台来运行的。52883就是这条命令对应进程的PID后台进程必须是非交互式执行的,不能是交互式的。

Linux进程管理-基本概念和命令

Linux进程管理-基本概念和命令

w是来查看所有登入用户的信息。

[[email protected] ~]# w

 08:42:46 up 14:41,  3 users,  load average: 0.49, 0.38, 0.32

USER     TTY      FROM              [email protected]   IDLE   JCPU   PCPU WHAT

root     pts/0    192.168.100.1    05:43    1:26m  0.01s  0.01s -bash

root     pts/1    192.168.100.1    05:55    1:17m  0.25s  0.05s sqlplus   as sysdba

root     pts/2    192.168.100.1    08:28    0.00s  0.05s  0.01s w

[1]+  Done                    find / -name init > /init.find

 

可以看到root用户是远程pts登入的,如果是tty那么就是本地登入。可以看到从哪一个地址登入的,登入的时间是什么时间,jcpu就是显示终端登入执行过所有的进程所占用的CPU的时间都会列出来。Pcpucpu在执行这个程序的时候消耗的时间。

通过w可以获得系统咨询,包括系统平均负载值,包括用户登入以后登入总计和当前程序

占用CPU时间和闲置时间。

Linux进程管理-基本概念和命令

 load average: 0.49, 0.38, 0.32  表示了系统的平均负载程度,分别取了三个时间段的值,分别是1,5,15。表示第一分钟,第5分钟,第15分钟系统平均负载的程度。要想知道平均负载值将这三个值加起来除以3即可。一般来说这个负载值在0.8以下,证明系统负载比较轻。

Linux进程管理-基本概念和命令


如果直接使用ps就是查看当前用户的进程。

[[email protected] oracle]# ps

   PID TTY          TIME CMD

  4219 pts/0    00:00:00 su

  4224 pts/0    00:00:00 bash

  6226 pts/0    00:00:00 ps

[[email protected] oracle]# ps -l

F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

4 S     0   4219   4178  0  80   0 - 53682 wait   pts/0    00:00:00 su

4 S     0   4224   4219  0  80   0 - 29171 wait   pts/0    00:00:00 bash

0 R     0   6272   4224  0  80   0 - 37233 -      pts/0    00:00:00 ps

通过TTY可以看到用户是本地登入还是远程登入。

Linux进程管理-基本概念和命令

Linux进程管理-基本概念和命令

Linux进程管理-基本概念和命令

最常使用的ps的命令是ps-aux,不过这个命令一般都不会单独使用,通过加上管道来过滤想要进程的信息。

 

[[email protected] oracle]# ps -aux | grep httpd

root       6672  0.0  0.0 112664   972 pts/0    R+   09:50   0:00 grep --color=auto httpd

如果要对进程的pid进行排序加上--sort pid来对进程进行排序。

 

如果要查看系统当中指定用户执行的进程可以使用

ps -uU 用户名

查看指定进程的信息

ps - le | grep 进程名称

 

如果还想查看系统当中所有进程的信息,还可以通过pstree | more来查看系统当中所有进程树状的结构。

[[email protected] oracle]# pstree | more

systemd-+-ModemManager---2*[{ModemManager}]

        |-NetworkManager---2*[{NetworkManager}]

        |-2*[abrt-watch-log]

        |-abrtd

        |-accounts-daemon---2*[{accounts-daemon}]

        |-alsactl

        |-at-spi-bus-laun-+-dbus-daemon---{dbus-daemon}

        |                 `-3*[{at-spi-bus-laun}]

        |-at-spi2-registr---2*[{at-spi2-registr}]

        |-atd

        |-auditd-+-audispd-+-sedispatch

        |        |         `-{audispd}

        |        `-{auditd}

        |-avahi-daemon---avahi-daemon

        |-bluetoothd

        |-caribou---2*[{caribou}]

        |-chronyd

        |-colord---2*[{colord}]

        |-crond

        |-cupsd

        |-2*[dbus-daemon---{dbus-daemon}]

        |-dbus-launch

        |-dconf-service---2*[{dconf-service}]

        |-dnsmasq---dnsmasq

        |-escd---{escd}

Linux进程管理-基本概念和命令

Linux进程管理-基本概念和命令

比如关闭一个Apache进程,直接使用kill 进程号,其实这并没有将这个服务关闭掉,因为Apache启动了多个进程。

有一种方方法是/etc/rc.d/init.d/httpd stop就可以将这个进程关闭掉。

[[email protected] etc]# cd rc.d/

[[email protected] rc.d]# ls

init.d  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local

[[email protected] rc.d]# cd init.d/

[[email protected] init.d]# ls

functions  netconsole  network  README

[[email protected] init.d]# ls -l

总用量 32

-rw-r--r--. 1 root root 15131 9月  12 2016 functions

-rwxr-xr-x. 1 root root  2989 9月  12 2016 netconsole

-rwxr-xr-x. 1 root root  6643 9月  12 2016 network

-rw-r--r--. 1 root root  1160 11月  7 2016 README

[[email protected] init.d]# /etc/rc.d/init.d/network  start

Starting network (via systemctl):                          [  OK  ]

 

 

假设Apache进程有多个,但是对应的父进程的id都是3567,那么直接杀死父进程,kill 3567就可以杀死所有进程了。因为父进程终止,子进程会自动终止。

有的时候在关闭进程的时候执行完以后,发现进程并没有被关闭。如果是root就可以尝试使用kill -9强行关闭这个进程。

 

 

正常情况下程序重新启动使用/etc/rc.d/init.d/httpd restart一下就行了 ,但是使用Kill -l也可以。Kill -l加上父亲进程的进程号就可以启动进程了。

 

如果里面所有的进程都叫http,那么结束所有的进程就可以使用killall httpd

[[email protected] init.d]# killall httpd

httpd: no process found

 

 

在根目录下面有一个proc这个目录,是process的缩写。

[[email protected] ~]# ls /proc

1     17    26    286   3000  3133  3382  379  476  6    675  9            filesystems  meminfo       swaps

这个目录是一个很特殊的目录,它是一个虚拟文件系统,在这个目录里面存储的数据很有特点,里面的东西并不是存放在硬盘上面的,而是存放在内存镜像里面的,这个目录里面存放的最主要的就是进程的信息,看到的里面的数字就是每一个系统当前正在运行的这个进程的PID所命名的目录名。每一个进程的信息都存放在目录当中,所以这是一个动态调整的一个目录。

[[email protected] ~]# cat /proc/meminfo    在这个目录下面可以查看内存的相关信息

MemTotal:         999936 kB

MemFree:           91888 kB

MemAvailable:     255384 kB

Buffers:               0 kB

[[email protected] ~]# cat /proc/partitions    查看分区的信息

major minor  #blocks  name

 

   8        0   31457280 sda

   8        1    1048576 sda1

   8        2   30407680 sda2

  11        0    1048575 sr0

 253        0   28303360 dm-0

 253        1    2097152 dm-1

因为这个目录的存在,可以使用一些p开头的命令。

比如说想查看httpd进程的pid,就可以使用pgrep 服务名就可以了。这样就可以检索到所有进程的pid

使用pkill加上服务的名称就可以将服务关闭,甚至不需要查看pid就可以将服务关闭了。

Linux进程管理-基本概念和命令

默认在linux里面启动一个进程,它的优先级就是0,在linux里面优先级的取值范围是-2019优先级的值越小,优先权就越大,也就是在一个CPU的时间片内,在分配时间的时候,它会排在前面,会优先处理。

 

如果要将oracle的优先级由0变为-5,可以[[email protected] ~]# /etc/rc.d/init.d/oracle  stop[[email protected] ~]# nice --5/etc/rc.d/init.d/oracle  start

Linux进程管理-基本概念和命令

[[email protected] ~]# nohup find / -name init* >  /root/find.init.2018.1.3 &

这样可以在root用户退出登入后,继续进行查找。

Linux进程管理-基本概念和命令

Linux进程管理-基本概念和命令Linux进程管理-基本概念和命令


/usr/share/man/man3/initgroup[[email protected] oracle]# top

top - 06:33:23 up  7:23,  8 users,  load average: 0.20, 0.25, 0.20

Tasks: 227 total,   1 running, 226 sleeping,   0 stopped,   0 zombie

Cpu(s):  1.0%us,  1.6%sy,  0.0%ni, 97.0%id,  0.2%wa,  0.0%hi,  0.2%si,  0.0%st

Mem:   2041764k total,  1959048k used,    82716k free,   120936k buffers

Swap:  2031612k total,     1432k used,  2030180k free,  1163020k cached

Which user (blank for all): oracle

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                  

  5220 oracle    20   0 1039m  17m  15m S  0.8  0.9   0:00.04 oracle                                                    

  4550 oracle    20   0 1039m  16m  14m S  0.2  0.8   0:02.77 oracle                                                    

  4570 oracle    20   0 1040m  21m  19m S  0.2  1.1   0:07.13 oracle      

上面这些命令是在top里面执行的