Linux进程管理-基本概念和命令
进程的概念
父子进程有两种特殊的情况,如果父亲进程终止,子进程来说是正常终止的,但是如果父亲进程终止了子进程没有终止,子进程会变为孤儿进程,他的父亲进程会指向init进程。另外一种情况是子进程终止了,父亲进程不知道,这个时候子进程会变为僵尸进程。在linux里面产生子进程都是通过fork来创建的。
前台进程简单来说就是可以在命令行上面输入一条命令
[[email protected] ~]# find / -name init查找以init开头的文件有哪些
这个命令一直在运行,shell也一直在等待这个命令执行完毕退出才显示结果给出用户的提示。用户在这个命令执行完毕之前不能执行另外一个命令。
后台进程是在shell提示符输入命令以后,后面可以加上后台执行符
[[email protected] ~]# find / -name init >/init.find &
[1] 52883
这个时候可以看到,shell会产一个子进程来执行这个命令,不需要等这个命令执行的结果再退出执行另外一条命令。上面命令是放在后台来运行的。52883就是这条命令对应进程的PID。后台进程必须是非交互式执行的,不能是交互式的。
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的时间都会列出来。Pcpu是cpu在执行这个程序的时候消耗的时间。
通过w可以获得系统咨询,包括系统平均负载值,包括用户登入以后登入总计和当前程序
占用CPU时间和闲置时间。
load average: 0.49, 0.38, 0.32 表示了系统的平均负载程度,分别取了三个时间段的值,分别是1,5,15。表示第一分钟,第5分钟,第15分钟系统平均负载的程度。要想知道平均负载值将这三个值加起来除以3即可。一般来说这个负载值在0.8以下,证明系统负载比较轻。
如果直接使用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可以看到用户是本地登入还是远程登入。
最常使用的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}
比如关闭一个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里面启动一个进程,它的优先级就是0,在linux里面优先级的取值范围是-20到19,优先级的值越小,优先权就越大,也就是在一个CPU的时间片内,在分配时间的时候,它会排在前面,会优先处理。
如果要将oracle的优先级由0变为-5,可以[[email protected] ~]# /etc/rc.d/init.d/oracle stop,[[email protected] ~]# nice --5/etc/rc.d/init.d/oracle start
[[email protected] ~]# nohup find / -name init* > /root/find.init.2018.1.3 &
这样可以在root用户退出登入后,继续进行查找。
/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里面执行的