第17章 程序管理与SELinux初探

什么是进程

触发任何一个事件时,系统都会将它定义为一个进程,并且给予这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关属性关系,给予这个进程一组有效的权限设置。

进程与程序

进程:执行一个程序或命令就可以触发一个事件而取得一个PID。

程序:系统仅仅认识二进制文件,当系统工作时,需要启动一个二进制文件,这个文件就是程序。

 

程序放在磁盘中,通过用户的执行来触发。触发后加载到内存中成为一个个体,这就是进程。每个进程有给予执行者的权限/属性等参数,并包括进程所需要的脚本与数据,最后再给予一个PID。

 

子进程与父进程:当我们登陆系统后,会取得一个bash的shell,然后利用这个bash提供的接口去执行另一个命令,那些另外执行的命令也会被触发称为PID,那个后来执行的命令产生的PID就是子进程。判断一个进程的父进程可以通过Parent PID (PPID)来判断。

 

//查看当前进程状态
[root@localhost 桌面]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   4177   4169  0  80   0 - 29168 wait   pts/0    00:00:00 bash
0 R     0   6631   4177  0  80   0 - 34343 -      pts/0    00:00:00 ps
//在当前bash下打开新的bash,即子进程
[root@localhost 桌面]# bash
//再次查看进程状态
[root@localhost 桌面]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   4177   4169  0  80   0 - 29168 wait   pts/0    00:00:00 bash
4 S     0   6635   4177  3  80   0 - 29170 wait   pts/0    00:00:00 bash
0 R     0   6667   6635  0  80   0 - 34343 -      pts/0    00:00:00 ps
[root@localhost 桌面]# 

 

fork and exec:过程调用流程,进程之间需要互相调用时,进程都会通过父进程以复制(fork)的方式产生一个一模一样的子进程,该子进程再以exec的方式执行实际需要进行的进程。

 工作管理(job control)

当我们登陆系统取得bash shell之后,在单一终端机下同时进行多个工作的行为管理。

job control的管理

要进行bash的job control必须注意以下的限制:

  • 这些工作所触发的进程必须来自于你shell的子进程(只管理自己的bash)
  • 前台:你可以控制与执行命令的环境称为前台(foreground)的工作
  • 后台:可以自行运行的工作,你无法control+c终止它,可使用bg/fg调用该工作
  • 后台中“执行”的进程不能等待terminal/shell的输入

job控制命令

1. 直接将命令丢到后台中执行的 &

在我们只有一个bash的环境下想要执行多个工作,可以将某些工作直接丢到后台当中,使用“&”表示。

[root@localhost 桌面]# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 15349
[root@localhost 桌面]# tar: 从成员名中删除开头的“/”

[1]+  完成                  tar -zpcf /tmp/etc.tar.gz /etc

上面的[1]是bash给予该命令的工作号,15349是该命令的PID。

上面指令没用数据流重定向,因此错误信息会显示出来,修改命令如下:

[root@localhost 桌面]# tar -zpcf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
[1] 15590
[root@localhost 桌面]# 
[root@localhost 桌面]# 
[1]+  完成                  tar -zpcf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1
[root@localhost 桌面]# cat /tmp/log.txt
tar: 从成员名中删除开头的“/”
[root@localhost 桌面]# 

上述代码将数据流重定向到/tmp/log.txt文件中,2>&1表示将标准输出和错误输出指向同一个文件,cat指令可以看到该文件的内容。

2. 将目前的工作丢到后台中“暂停”:ctrl+z

如果正在使用vi,此时想要去查找一个文件,并不需要结束vi,只需要将vi丢到后台。

[root@localhost 桌面]# vim ~/.bashrc

//点击ctrl+z暂停vim

[1]+  已停止               vim ~/.bashrc
[root@localhost 桌面]# find ~/script -print
/root/script
/root/script/sh01.sh
/root/script/sh02.sh
/root/script/sh03.sh
……

//查看后台进程,+表示最近被丢到后台的进程
[root@localhost 桌面]# jobs -ls
[1]+ 16025 停止                  vim ~/.bashrc

 

3. 将后台工作拿到前台处理:fg

使用“fg %jobnumber”可以将后台工作拿到前台(直接使用fg则取得的是最后一次放入到后台的进程)。

4. 让工作在后台下的状态变成运行中:bg

前面提到可以使用ctrl+z将当前工作丢到后台中“暂停”,可以使用“bg %jobnumber”使之在后台运行。

5. 管理后台当中的工作:kill

kill -signal %jobnumber

kill -signal PID

参数:

-l:列出目前kill能够使用的信号

signal:代表给予后面接的那个工作什么样的指示。用man 7 signal可知:

-1:重新读取一次参数的配置文件

-2:代表与由键盘输入ctrl+c同样的操作

-9:立刻强制删除一个工作

-15:以正常的程序方式终止工作。

[root@localhost 桌面]# kill -l
 1) SIGHUP        2) SIGINT          3) SIGQUIT        4) SIGILL         5) SIGTRAP
 6) SIGABRT       7) SIGBUS          8) SIGFPE         9) SIGKILL        10) SIGUSR1
11) SIGSEGV      12) SIGUSR2        13) SIGPIPE       14) SIGALRM        15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD        18) SIGCONT       19) SIGSTOP        20) SIGTSTP
21) SIGTTIN      22) SIGTTOU        23) SIGURG        24) SIGXCPU        25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF        28) SIGWINCH      29) SIGIO          30) SIGPWR
31) SIGSYS       34) SIGRTMIN       35) SIGRTMIN+1    36) SIGRTMIN+2     37) SIGRTMIN+3
38) SIGRTMIN+4     39) SIGRTMIN+5    40) SIGRTMIN+6     41) SIGRTMIN+7     42) SIGRTMIN+8
43) SIGRTMIN+9     44) SIGRTMIN+10   45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13
48) SIGRTMIN+14    49) SIGRTMIN+15   50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12
53) SIGRTMAX-11    54) SIGRTMAX-10   55) SIGRTMAX-9     56) SIGRTMAX-8     57) SIGRTMAX-7
58) SIGRTMAX-6     59) SIGRTMAX-5    60) SIGRTMAX-4     61) SIGRTMAX-3     62) SIGRTMAX-2
63) SIGRTMAX-1     64) SIGRTMAX    

举例:

[root@localhost 桌面]# jobs -ls
[1]+ 16025 停止                  vim ~/.bashrc
[root@localhost 桌面]# kill -9 %1
[1]+  已杀死               vim ~/.bashrc
[root@localhost 桌面]# jobs
[root@localhost 桌面]# 

脱机管理问题

我们在工作管理中提到的后台并不是系统的后台,而是指在终端机模式下可以避免ctrl+c中断的情景。工作管理的后台依旧与终端机有关。远程连接的方式连接到linux主机并且以工作方式&的方法放到后台的工作在脱机以后便会终止。

nohup可以让你在脱机或注销系统后,还能让工作继续进行。

nohup [命令与参数] :在终端机前台工作

nohup [命令与参数]  &:在终端机后台工作

进程管理

进程的查看

ps:将某个时间点的进程运行情况选取下来

ps aux:查看系统所有进程

ps -lA:同上

ps axjf:连同部分进程树状态

[root@localhost 桌面]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.2 191644  6948 ?        Ss   01:19   0:27 /usr/lib/syste
root          2  0.0  0.0      0     0 ?        S    01:19   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    01:19   0:01 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   01:19   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    01:19   0:08 [migration/0]
root          8  0.0  0.0      0     0 ?        S    01:19   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/0]
root         10  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/1]
root         11  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/2]
root         12  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/3]
root         13  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/4]
root         14  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/5]
root         15  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/6]
root         16  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/7]
root         17  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/8]
root         18  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/9]
root         19  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/10]
root         20  0.0  0.0      0     0 ?        S    01:19   0:00 [rcuob/11]
……
[root@localhost 桌面]# ps -lA
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 - 47911 ep_pol ?        00:00:27 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:01 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:08 migration/0
1 S     0      8      2  0  80   0 -     0 rcu_gp ?        00:00:00 rcu_bh
1 S     0      9      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/0
1 S     0     10      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/1
1 S     0     11      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/2
1 S     0     12      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/3
1 S     0     13      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/4
1 S     0     14      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/5
1 S     0     15      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/6
1 S     0     16      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/7
1 S     0     17      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/8
1 S     0     18      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/9
1 S     0     19      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/10
1 S     0     20      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/11
1 S     0     21      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/12
1 S     0     22      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/13
1 S     0     23      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/14
1 S     0     24      2  0  80   0 -     0 rcu_no ?        00:00:00 rcuob/15
……
[root@localhost 桌面]# ps axjf
  PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
     0      2      0      0 ?            -1 S        0   0:00 [kthreadd]
     2      3      0      0 ?            -1 S        0   0:01  \_ [ksoftirqd/0]
     2      5      0      0 ?            -1 S<       0   0:00  \_ [kworker/0:0H]
     2      7      0      0 ?            -1 S        0   0:08  \_ [migration/0]
     2      8      0      0 ?            -1 S        0   0:00  \_ [rcu_bh]
     2      9      0      0 ?            -1 S        0   0:00  \_ [rcuob/0]
     2     10      0      0 ?            -1 S        0   0:00  \_ [rcuob/1]
     2     11      0      0 ?            -1 S        0   0:00  \_ [rcuob/2]
     2     12      0      0 ?            -1 S        0   0:00  \_ [rcuob/3]
     2     13      0      0 ?            -1 S        0   0:00  \_ [rcuob/4]
     2     14      0      0 ?            -1 S        0   0:00  \_ [rcuob/5]
     2     15      0      0 ?            -1 S        0   0:00  \_ [rcuob/6]
     0      1      1      1 ?            -1 Ss       0   0:27 /usr/lib/systemd/s
     1    758    758    758 ?            -1 Ss       0   0:07 /usr/lib/systemd/s
     1    776    776    776 ?            -1 Ss       0   0:00 /usr/sbin/lvmetad 
     1    790    790    790 ?            -1 Ss       0   0:02 /usr/lib/systemd/s
     1    916    916    916 ?            -1 S<sl     0   0:01 /sbin/auditd -n
   916    933    933    933 ?            -1 S<sl     0   0:00  \_ /sbin/audispd
   933    937    933    933 ?            -1 S<       0   0:00      \_ /usr/sbin/
     1    940    940    940 ?            -1 SNs      0   0:00 /usr/sbin/alsactl 
     1    942    942    942 ?            -1 Ssl      0   3:06 /usr/bin/vmtoolsd
     1    943    943    943 ?            -1 Ssl      0   0:02 /usr/sbin/rsyslogd
     1    945    945    945 ?            -1 Ss       0   0:00 /usr/sbin/abrtd -d
     1    946    946    946 ?            -1 SNsl   172   0:25 /usr/libexec/rtkit
  1453   2057   2057   2057 tty1       2057 Rsl+     0  11:50  \_ /usr/bin/Xorg 
  1453   3338   1453   1453 ?            -1 Sl       0   0:01  \_ gdm-session-wo
  3338   3385   3385   3385 ?            -1 Ssl      0   0:01      \_ gnome-sess
  3385   3538   3538   3538 ?            -1 Ss       0   0:02          \_ /usr/b
  3385   3570   3385   3385 ?            -1 Sl       0   0:13          \_ /usr/l
  3385   3608   3385   3385 ?            -1 Rl       0  45:39          \_ /usr/b
  3608   3635   3635   3385 ?            -1 Sl       0   1:59          |   \_ ib
  3635   3640   3635   3385 ?            -1 Sl       0   0:00          |   |   \
  3635   4057   3635   3385 ?            -1 Sl       0   0:00          |   |   \
  3635   5438   3635   3385 ?            -1 Sl       0   1:05          |   |   \
  3608   5257   3385   3385 ?            -1 Sl       0  21:16          |   \_ /u
  3385   3705   3385   3385 ?            -1 Sl       0   0:42          \_ nautil
  3385   3710   3385   3385 ?            -1 SNl      0   0:00          \_ /usr/l
  3385   3713   3385   3385 ?            -1 Sl       0   0:04          \_ /usr/b
  3385   3717   3385   3385 ?            -1 S        0   0:00          \_ /usr/b
  3385   3732   3385   3385 ?            -1 Sl       0   0:04          \_ abrt-a
  3385   3734   3385   3385 ?            -1 SNl      0   0:00          \_ /usr/l
  3385   3735   3385   3385 ?            -1 SNl      0   0:00          \_ /usr/l
  3385   3738   3385   3385 ?            -1 SNl      0   0:02          \_ /usr/l
[root@localhost 桌面]# 

仅查看自己的bash的进程:ps -l

[root@localhost 桌面]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  16877   4169  0  80   0 - 29168 wait   pts/1    00:00:00 bash
0 R     0  17074  16877  0  80   0 - 34343 -      pts/1    00:00:00 ps

F:代表进程标志,说明这个进程的权限,4为root权限,1表示此子进程仅可以进行复制(fork)而无法实际执行(exec)

S:进程的状态,R表所运行,S表示睡眠但可唤醒,D表示不可被唤醒的睡眠状态,T表示停止状态,Z表示僵尸状态,已经终止但无法删除

C:cpu使用率

PRI/NI:进程被cpu执行的优先级

TIME:使用掉CPU的时间

 

top:动态查看进程的变化

top [-d 数字] | top [-bnp]

参数:

-d:后面接更新秒数,默认5秒

-b:以批次的方式执行top

-n:与-b搭配,表示需要进行几次top的输出结果

-p:指定某些个PID来进行检测

在top执行过程中可使用以下按键命令:

?:显示top中可以输入的按键命令

P:以cpu的使用资源排序显示

M:以内存的使用资源排序

N:以PID排序

T:以进程的使用的CPU时间积累排序

k:给予某一个PID一个信号

r:给予某一个PID重新制定一个nice值

q:离开top软件的按键

范例1:

查看系统进程信息

top - 20:29:21 up 20:16,  3 users,  load average: 0.27, 0.10, 0.13
Tasks: 442 total,   1 running, 441 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.3 us,  0.5 sy,  0.0 ni, 98.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2865548 total,  1040848 free,  1111388 used,   713312 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1421616 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                             
  3608 root      20   0 1875856 277860  52544 S  73.7  9.7  55:24.79 gnome-shell                                         
  2057 root      20   0  295816  77452  10940 S  26.3  2.7  15:09.70 Xorg                                                
 17700 root      20   0  146408   2248   1384 R  10.5  0.1   0:00.05 top                                                 
   139 root      20   0       0      0      0 S   5.3  0.0   0:28.29 rcuos/1                                             
  3554 root      20   0   38036   3000   1400 S   5.3  0.1   0:58.18 dbus-daemon                                         
  3635 root      20   0  471764   9720   3688 S   5.3  0.3   2:27.75 ibus-daemon                                         
  3671 root      20   0  578660  11096   5336 S   5.3  0.4   1:00.77 caribou                                             
     1 root      20   0  191644   6948   3912 S   0.0  0.2   0:27.91 systemd                                             
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.27 kthreadd                                            
     3 root      20   0       0      0      0 S   0.0  0.0   0:01.55 ksoftirqd/0                                         
     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                        
     7 root      rt   0       0      0      0 S   0.0  0.0   0:09.26 migration/0                                         
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                              
     9 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/0                

范例2:

将top信息输出到文件,top信息执行两次并输出到文件。

[root@localhost 桌面]# top -b -n 2 > /tmp/top.txt

范例3:

查看单一进程的运行状态

//获取当前bash的PID
[root@localhost 桌面]# echo $$ 16877 [root@localhost 桌面]# top -d 2 -p 16877 top - 20:35:18 up 20:22, 3 users, load average: 0.02, 0.09, 0.13 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.8 us, 0.4 sy, 0.0 ni, 98.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 2865548 total, 1040176 free, 1112080 used, 713292 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 1421044 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 16877 root 20 0 116672 3320 1712 S 0.0 0.1 0:00.29 bash

 

pstree:查看进程之间的关系

pstree [-A|U] [-up]

参数:

-A:各进程树之间以ASCII字符连接

-U:各进程树之间以utf8字符连接

-p:同时显示PID

-u:同时列出每个进程所属账号名

[root@localhost 桌面]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─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───{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
        ├─evolution-calen───5*[{evolution-calen}]
        ├─evolution-sourc───2*[{evolution-sourc}]
        ├─gconfd-2
        ├─gdm─┬─Xorg───4*[{Xorg}]
        │     ├─gdm-session-wor─┬─gnome-session─┬─abrt-applet───{abrt-applet}
        │     │                 │               ├─gnome-settings-───4*[{gnome-settings-}]
        │     │                 │               ├─gnome-shell─┬─firefox───47*[{firefox}]
        │     │                 │               │             ├─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
        │     │                 │               │             │             ├─ibus-engine-lib───2*[{ibus-engine-lib}]
        │     │                 │               │             │             ├─ibus-engine-sim───2*[{ibus-engine-sim}]
        │     │                 │               │             │             └─2*[{ibus-daemon}]
        │     │                 │               │             └─10*[{gnome-shell}]
        │     │                 │               ├─gnome-software───3*[{gnome-software}]
        │     │                 │               ├─nautilus───3*[{nautilus}]
        │     │                 │               ├─seapplet
        │     │                 │               ├─ssh-agent
        │     │                 │               ├─tracker-extract───13*[{tracker-extract}]
        │     │                 │               ├─tracker-miner-a───2*[{tracker-miner-a}]
        │     │                 │               ├─tracker-miner-f───3*[{tracker-miner-f}]
        │     │                 │               ├─tracker-miner-u───2*[{tracker-miner-u}]
        │     │                 │               └─3*[{gnome-session}]
        │     │                 └─2*[{gdm-session-wor}]
        │     └─3*[{gdm}]
        ├─geoclue───{geoclue}
        ├─gnome-keyring-d───4*[{gnome-keyring-d}]
        ├─gnome-shell-cal───4*[{gnome-shell-cal}]
        ├─gnome-terminal-─┬─bash───bash
        │                 ├─bash───pstree
        │                 ├─gnome-pty-helpe
        │                 └─3*[{gnome-terminal-}]
        ├─goa-daemon───3*[{goa-daemon}]
        ├─goa-identity-se───2*[{goa-identity-se}]
        ├─gsd-printer───{gsd-printer}
        ├─gssproxy───5*[{gssproxy}]
        ├─gvfs-afc-volume───2*[{gvfs-afc-volume}]
        ├─gvfs-goa-volume───{gvfs-goa-volume}
        ├─gvfs-gphoto2-vo───{gvfs-gphoto2-vo}
        ├─gvfs-mtp-volume───{gvfs-mtp-volume}
        ├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]
        ├─gvfsd───{gvfsd}
        ├─gvfsd-fuse───4*[{gvfsd-fuse}]
        ├─gvfsd-metadata───{gvfsd-metadata}
        ├─gvfsd-trash───2*[{gvfsd-trash}]
        ├─ibus-x11───2*[{ibus-x11}]
        ├─irqbalance
        ├─ksmtuned───sleep
        ├─libvirtd───15*[{libvirtd}]
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─mission-control───2*[{mission-control}]
        ├─packagekitd───2*[{packagekitd}]
        ├─polkitd───5*[{polkitd}]
        ├─pulseaudio───2*[{pulseaudio}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─smartd
        ├─sshd
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tracker-store───7*[{tracker-store}]
        ├─udisksd───4*[{udisksd}]
        ├─upowerd───2*[{upowerd}]
        ├─vmtoolsd───{vmtoolsd}
        ├─vmtoolsd
        └─wpa_supplicant

 

进程管理

进程之间是可以相互控制的,那么如果互相管理的呢?其实是通过给予该进程一个信号去告知该进程你想要它做什么!

前面bash工作管理一节中提到过,要给予某个已经存在后台的工作某些操作时,直接给予一个信号给该工作号码即可。使用kill -l可以查看所有信号。常用的如下:

代号 名称 内容
1 SIGHUP 启动被终止的进程,可让该PID重新读取自己的配置文件,类似重新启动
2 SIGINT 相当于键盘的ctrl+c来中断一个进程
9 SIGKILL 强制中断一个进程
15 SIGTERM 以正常方式中断进行
17 SIGSTOP 相当于键盘的ctrl+z来暂停进程

 

kill -signal PID

kill可以帮我们将这个signal传递给某个工作(%jobnumber)或某个PID。

关于进程的执行顺序

 进程的优先级由PRI的值决定,值越小表明优先级越高,不过PRI的值是由内核动态调整的,用户无法直接调整PRI的值。如果需要修改进程的优先级,可以通过修改NI(nice)的值来修改PRI,PRI与NI的值由以下关系:

PRI(new) = PRI(old) + NI

  • nice的值的调整范围为-20~19
  • root可以随意调整自己或他人的进程的nice值,调整范围为-20~19
  • 一般用户只能调整自己的进程,调整范围为0~19,这说明一般用户只能将自己的进程的PRI调高。

nice:新执行的命令给予新的nice值

nice [-n 数字] command

参数:

-n:后面接数字,范围-19~20

[root@localhost 桌面]# nice -n -5 vi &
[1] 30159
[root@localhost 桌面]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  29986   4169  0  80   0 - 29168 wait   pts/1    00:00:00 bash
4 T     0  30159  29986  0  75  -5 - 31546 signal pts/1    00:00:00 vi
0 R     0  30163  29986  0  80   0 - 34343 -      pts/1    00:00:00 ps

[1]+  已停止               nice -n -5 vi
[root@localhost 桌面]# kill -9 %1
[1]+  已杀死               nice -n -5 vi
[root@localhost 桌面]# 

renice:以存在的进程的nice值调整

renice [number] PID

[root@localhost 桌面]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  29986   4169  0  80   0 - 29188 wait   pts/1    00:00:00 bash
0 R     0  30225  29986  0  80   0 - 34343 -      pts/1    00:00:00 ps
[root@localhost 桌面]# renice 10 29986
29986 (进程 ID) 旧优先级为 0,新优先级为 10
[root@localhost 桌面]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  29986   4169  0  90  10 - 29188 wait   pts/1    00:00:00 bash
0 R     0  30233  29986  0  90  10 - 34343 -      pts/1    00:00:00 ps
[root@localhost 桌面]# 

上面的例子可以看出,我们修改bash这个进程的nice值后,由该bash触发的ps进程的nice值也会改变。除了nice外,在top里也可以调整nice的值。

 

系统资源的查看

free:查看内存的情况

free [-b|-k|-m|-g] [-t]

参数:

-b:默认单位为KB,b表示bytes,m表示MB,k表示KB,g表示GB

-t:显示物理内存与swap的总量

uname:查看系统与内核相关信息

uname [-asrmpi]

参数:

-a:系统所有相关信息

-s:系统内核名称

-r:内核版本

-m:本系统的硬件名称

-p:cpu类型

-i:硬件平台

[root@localhost 桌面]# uname -a
Linux localhost.localdomain 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

 

uptime:查看系统启动时间与工作负载

[root@localhost 桌面]# uptime
 18:26:39 up 1 day, 18:13,  2 users,  load average: 0.02, 0.02, 0.05

 

netstat:跟踪网络

netstat -[atunlp]

参数:

-a:将目前系统上所有的连接、监听、Socket数据都列出来

-t:列出tcp网络数据包的数据

-u:列出udp网络数据包的数据

-n:不列出进程的服务名称,以端口号显示

-l:列出目前正在监听的服务

-p:列出该网络服务的进程PID

举例:查看系统正在监听的网络连接以及其PID

[root@localhost 桌面]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      2733/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1439/sshd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1436/cupsd          
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2363/master         
tcp6       0      0 :::22                   :::*                    LISTEN      1439/sshd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      1436/cupsd          
tcp6       0      0 ::1:25                  :::*                    LISTEN      2363/master         
[root@localhost 桌面]# 

 

dmesg:分析内核产生的信息

比如网卡的代号是eth,便可以通过内核检测的信息查看网卡信息

[root@localhost 桌面]# dmesg | grep -i eth
[   14.040049] e1000 0000:02:01.0 eth0: (PCI:66MHz:32-bit) 00:0c:29:7f:dd:91
[   14.040070] e1000 0000:02:01.0 eth0: Intel(R) PRO/1000 Network Connection
[  299.156284] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[root@localhost 桌面]# 

 

vmstat:检测系统资源变化

vmstat [-a] [延迟 [总计检测次数]]  :cpu/内存等信息

vmstat [-fs]  内存相关

vmstat [-S 单位]  设置数据的单位

vmstat [-d]  与磁盘相关

vmstat [-p 分区]  与磁盘相关

 

特殊文件与程序

具有SUID/SGID权限的命令执行状态

省略

/proc/*代表的意义

省略

 

查询已打开文件或已执行程序打开的文件

fuster:通过文件找到正在使用该文件的程序

fuser [-umv] [-k [i] [-signal]]  file/dir

参数:

-u:除了进程的PID之外,同时列出该进程的所有者

-m:后面接的那个文件名会主动提到该文件系统的顶层,对umount不成功很有效

-v:可以列出每个文件与程序还有命令的完整相关性

-k:找出使用该文件/目录的PID,并试图以SIGKILL这个信号给予该PID

-i:与-k配合,删除PID之前询问用户

-signal:默认为-9

[root@localhost 桌面]# fuser -uv .
                     用户     进程号 权限   命令
/root/桌面:        root      29986 ..c.. (root)bash
                     root      30596 ..c.. (root)more

lsof:列出被进程所打开的文件名

lsof [-aUu] [+d]

参数:

-a:多项数据需要”同时成立“才显示结果

-U:仅列出Unix like系统的socket文件类型

-u:后面接username,仅列出该用户相关进程打开的文件

+d:后面接目录,即找出该目录下被打开的文件与设备

[root@localhost 桌面]# lsof -u root -a -U
COMMAND     PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
systemd       1 root   12u  unix 0xffff8800359c9a40      0t0  13538 /run/systemd/private
systemd       1 root   20u  unix 0xffff880035a87800      0t0   9957 /run/udev/control
systemd       1 root   21u  unix 0xffff8800b736f440      0t0  14926 /run/lvm/lvmpolld.socket
systemd       1 root   22u  unix 0xffff8800359e0000      0t0  10641 /run/systemd/notify
systemd       1 root   23u  unix 0xffff8800359e0b40      0t0  10659 /run/systemd/journal/stdout
systemd       1 root   26u  unix 0xffff8800359e0f00      0t0  10662 /run/systemd/journal/socket
systemd       1 root   27u  unix 0xffff8800359e12c0      0t0  10664 /dev/log
systemd       1 root   28u  unix 0xffff8800b736fbc0      0t0  14944 /run/systemd/shutdownd

pdiof:找出某个正在执行的进程的PID

pidof [-sx] program_name

参数:

-s:尽列出一个PID

-x:同时列出该program_name可能的PPID那个进程的PID

[root@localhost 桌面]# pidof -x bash
29986 1035

 

 

SELinux初探

什么是SELinux

SELinux全称为Security Enhanced Linux。

  • 当初设计的目标:避免资源的误用。SELinux是在进行程序、文件等权限设置依据的一个内核模块。
  • 传统的文件权限与账号关系:自主访问控制,DAC。(1)root具有最高权限,如果某个程序被人取得,该程序正好具有root权限,那么该程序就可以访问系统的任何资源。(2)用户可以取得进程来更改文件资源的访问权限
  • 以策略规则制定特点程序读取特定文件:委托访问控制,MAC

SELinux的运行模式

主体:SELinux管理的进程

目标:主体能否访问的目标资源,一般是文件系统

策略:(1)targeted:针对网络服务限制较多,针对本机限制较少,是默认的策略。(2)strict:完整的SELinux限制,限制方面较为严格。

安全上下文:主体程序必须要通过SELinux策略内的规则放行,然后与目标资源进行安全上下文比较,比较成功才能访问目标资源。

 

查看当前目录的安全上下文:

[root@localhost ~]# ls -Z
-rw-------. root   root   system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 Desktop
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 eclipse
-rw-------. root   root   system_u:object_r:admin_home_t:s0 initial-setup-ks.cfg
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 script
-rw-r--r--. root   root   unconfined_u:object_r:admin_home_t:s0 shadow
-rwxrwxr-x. wuchao wuchao unconfined_u:object_r:admin_home_t:s0 test
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 wuchao
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 公共
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 模板
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 视频
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 图片
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 文档
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 下载
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 音乐
drwxr-xr-x. root   root   unconfined_u:object_r:admin_home_t:s0 桌面
[root@localhost ~]# 

如上,安全上下文使用冒号分割为三段:

Identify:role:type

  •  身份标示(Identify)
  • root:表示root的账号身份
  • system_u:表示系统程序方面的标示,通常是进程
  • user_u:代表一般用户账号相关的身份
  • unconfined_u:不受限的用戶,也就是說,該檔案來自於不受限的程序所產生的!一般來說,我們使用可登入帳號來取得 bash 之後, 預設的 bash 環境是不受 SELinux 管制的~因為 bash 並不是什麼特別的網路服務!因此,在這個不受 SELinux 所限制的 bash 程序所產生的檔案, 其身份識別大多就是 unconfined_u 這個『不受限』用戶囉!
  • 角色(Role)
  • object_r:代表的是文件或目录等文件资源
  • system_r:代表的是进程,不过一般用户也会被指定为system_r
  • 类型(Type 最重要)
  • type:在文件资源(Object)上称为类型(Type)
  • domain:在主体程序(Subject)中则称为域(domain)
  • 注:domain需与type搭配,该程序才能顺利访问文件资源
  • 进程与文件SELinux type字段的相关性
身份识别 角色 在targeted下的意义
root system_r 代表供root账号登录时所取得的权限
system_u system_r 由于为系统账号,因此是非交互式的系统运行程序
user_u system_r 一般可登录用户的进程

举例:

[root@localhost grub]# ll -Zd /usr/sbin/crond /etc/crontab /etc/cron.d
drwxr-xr-x. root root system_u:object_r:system_cron_spool_t:s0 /etc/cron.d
-rw-r--r--. root root system_u:object_r:system_cron_spool_t:s0 /etc/crontab
-rwxr-xr-x. root root system_u:object_r:crond_exec_t:s0 /usr/sbin/crond

当我们执行 /usr/sbin/crond 之後,这个程序的domain类型变为system_cron_spool_t。因此不论 /etc/crontab, /etc/cron.d 以及 /var/spool/cron 都會是相关的 SELinux 类型 (/var/spool/cron 为user_cron_spool_t)。

    1. 首先,我們觸發一個可執行的目標檔案,那就是具有 crond_exec_t 這個類型的 /usr/sbin/crond 檔案;
    2. 該檔案的類型會讓這個檔案所造成的主體程序 (Subject) 具有 crond 這個領域 (domain), 我們的政策針對這個領域已經制定了許多規則,其中包括這個領域可以讀取的目標資源類型;
    3. 由於 crond domain 被設定為可以讀取 system_cron_spool_t 這個類型的目標檔案 (Object), 因此你的設定檔放到 /etc/cron.d/ 目錄下,就能夠被 crond 那支程序所讀取了;
    4. 但最終能不能讀到正確的資料,還得要看 rwx 是否符合 Linux 權限的規範!

SELinux的启动、关闭与查看

SELinux支持三种模式

(1)enforcing:强制模式,代表SELinux正在运行,且已正确开始限制domain/type了

(2)permissive:宽容模式,代表SELinux正在运行,不过仅会有警告信息并不会实际限制domain/type的访问

(3)disable:关闭SELinux

 

getenforce:查看目前SELinux模式

[root@localhost ~]# getenforce
Enforcing

sestatus:查看SELinux的策略

[root@localhost ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28
[root@localhost ~]# 

查看SELinux的配置文件

[root@localhost ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

可以通过修改以上文件来更改SELinux的模式,不过如果由disabled切换到enforcing或permissive,或者由这两种切换到disabled,更改完后必须重新启动。因为SELinux是整合到Linux的内核的,所以你可以在permissive和enforcing两种模式下切换,但不能关闭它(即设为disabled)

模式切换

setenforce [1|0]

  参数:

0:切换为permissive

1:切换为enforcing

 

SELinux 策略內的规则管理

SELinux 各个规则的布林值查询 getsebool

[root@localhost grub]# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off
authlogin_yubikey --> off
awstats_purge_apache_log_files --> off
boinc_execmem --> on
cdrecord_read_content --> off
cluster_can_network_connect --> off
cluster_manage_all_files --> off
cluster_use_execmem --> off
cobbler_anon_write --> off
cobbler_can_network_connect --> off
cobbler_use_cifs --> off
cobbler_use_nfs --> off
collectd_tcp_network_connect --> off
condor_tcp_network_connect --> off
conman_can_network --> off
cron_can_relabel --> off
cron_system_cronjob_use_shares --> off
cron_userdomain_transition --> on

后面内容暂时省略,难度较大,需要时再补上。

 

 

 

 

 

 

 

 

posted @ 2016-09-04 21:10  且听风吟-wuchao  阅读(446)  评论(0编辑  收藏  举报