什么是进程

触发任何一个事件时,系统都会将它定义为一个进程,并且给予这个进程一个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
S - wait pts/ :: bash
R - - pts/ :: ps
//在当前bash下打开新的bash,即子进程
[root@localhost 桌面]# bash
//再次查看进程状态
[root@localhost 桌面]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
S - wait pts/ :: bash
S - wait pts/ :: bash
R - - pts/ :: 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 &
[]
[root@localhost 桌面]# tar: 从成员名中删除开头的“/” []+ 完成 tar -zpcf /tmp/etc.tar.gz /etc

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

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

[root@localhost 桌面]# tar -zpcf /tmp/etc.tar.gz /etc > /tmp/log.txt >& &
[]
[root@localhost 桌面]#
[root@localhost 桌面]#
[]+ 完成 tar -zpcf /tmp/etc.tar.gz /etc > /tmp/log.txt >&
[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

[]+  已停止               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
[]+ 停止 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
) SIGHUP     ) SIGINT      ) SIGQUIT    ) SIGILL     ) SIGTRAP
) SIGABRT   ) SIGBUS      ) SIGFPE     ) SIGKILL     ) SIGUSR1
) SIGSEGV   ) SIGUSR2     ) SIGPIPE    ) SIGALRM     ) SIGTERM
) SIGSTKFLT   ) SIGCHLD     ) SIGCONT    ) SIGSTOP     ) SIGTSTP
) SIGTTIN   ) SIGTTOU     ) SIGURG     ) SIGXCPU     ) SIGXFSZ
) SIGVTALRM   ) SIGPROF     ) SIGWINCH   ) SIGIO       ) SIGPWR
) SIGSYS    ) SIGRTMIN    ) SIGRTMIN+ ) SIGRTMIN+  ) SIGRTMIN+
) SIGRTMIN+  ) SIGRTMIN+    ) SIGRTMIN+  ) SIGRTMIN+  ) SIGRTMIN+
) SIGRTMIN+  ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMIN+
) SIGRTMIN+ ) SIGRTMIN+ ) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-
) SIGRTMAX- ) SIGRTMAX- ) SIGRTMAX-  ) SIGRTMAX-  ) SIGRTMAX-
) SIGRTMAX-  ) SIGRTMAX- ) SIGRTMAX-  ) SIGRTMAX-  ) SIGRTMAX-
) SIGRTMAX-  ) SIGRTMAX

举例:

[root@localhost 桌面]# jobs -ls
[]+ 停止 vim ~/.bashrc
[root@localhost 桌面]# kill - %
[]+ 已杀死 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 0.0 0.2 ? Ss : : /usr/lib/syste
root 0.0 0.0 ? S : : [kthreadd]
root 0.0 0.0 ? S : : [ksoftirqd/]
root 0.0 0.0 ? S< : : [kworker/:0H]
root 0.0 0.0 ? S : : [migration/]
root 0.0 0.0 ? S : : [rcu_bh]
root 0.0 0.0 ? S : : [rcuob/]
root 0.0 0.0 ? S : : [rcuob/]
root 0.0 0.0 ? S : : [rcuob/]
root 0.0 0.0 ? S : : [rcuob/]
root 0.0 0.0 ? S : : [rcuob/]
root 0.0 0.0 ? S : : [rcuob/]
root 0.0 0.0 ? S : : [rcuob/]
root 0.0 0.0 ? S : : [rcuob/]
root 0.0 0.0 ? S : : [rcuob/]
root 0.0 0.0 ? S : : [rcuob/]
root 0.0 0.0 ? S : : [rcuob/]
root 0.0 0.0 ? S : : [rcuob/]
……
[root@localhost 桌面]# ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
S - ep_pol ? :: systemd
S - kthrea ? :: kthreadd
S - smpboo ? :: ksoftirqd/
S - - worker ? :: kworker/:0H
S - - - smpboo ? :: migration/
S - rcu_gp ? :: rcu_bh
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
S - rcu_no ? :: rcuob/
……
[root@localhost 桌面]# ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
? - S : [kthreadd]
? - S : \_ [ksoftirqd/]
? - S< : \_ [kworker/:0H]
? - S : \_ [migration/]
? - S : \_ [rcu_bh]
? - S : \_ [rcuob/]
? - S : \_ [rcuob/]
? - S : \_ [rcuob/]
? - S : \_ [rcuob/]
? - S : \_ [rcuob/]
? - S : \_ [rcuob/]
? - S : \_ [rcuob/]
? - Ss : /usr/lib/systemd/s
? - Ss : /usr/lib/systemd/s
? - Ss : /usr/sbin/lvmetad
? - Ss : /usr/lib/systemd/s
? - S<sl : /sbin/auditd -n
? - S<sl : \_ /sbin/audispd
? - S< : \_ /usr/sbin/
? - SNs : /usr/sbin/alsactl
? - Ssl : /usr/bin/vmtoolsd
? - Ssl : /usr/sbin/rsyslogd
? - Ss : /usr/sbin/abrtd -d
? - SNsl : /usr/libexec/rtkit
tty1 Rsl+ : \_ /usr/bin/Xorg
? - Sl : \_ gdm-session-wo
? - Ssl : \_ gnome-sess
? - Ss : \_ /usr/b
? - Sl : \_ /usr/l
? - Rl : \_ /usr/b
? - Sl : | \_ ib
? - Sl : | | \
? - Sl : | | \
? - Sl : | | \
? - Sl : | \_ /u
? - Sl : \_ nautil
? - SNl : \_ /usr/l
? - Sl : \_ /usr/b
? - S : \_ /usr/b
? - Sl : \_ abrt-a
? - SNl : \_ /usr/l
? - SNl : \_ /usr/l
? - SNl : \_ /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
S - wait pts/ :: bash
R - - pts/ :: 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 - :: up :,   users,  load average: 0.27, 0.10, 0.13
Tasks: total, running, sleeping, stopped, 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 : total, free, used, buff/cache
KiB Swap: total, free, used. avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root S 73.7 9.7 :24.79 gnome-shell
root S 26.3 2.7 :09.70 Xorg
root R 10.5 0.1 :00.05 top
root S 5.3 0.0 :28.29 rcuos/
root S 5.3 0.1 :58.18 dbus-daemon
root S 5.3 0.3 :27.75 ibus-daemon
root S 5.3 0.4 :00.77 caribou
root S 0.0 0.2 :27.91 systemd
root S 0.0 0.0 :00.27 kthreadd
root S 0.0 0.0 :01.55 ksoftirqd/
root - S 0.0 0.0 :00.00 kworker/:0H
root rt S 0.0 0.0 :09.26 migration/
root S 0.0 0.0 :00.00 rcu_bh
root S 0.0 0.0 :00.00 rcuob/

范例2:

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

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

范例3:

查看单一进程的运行状态

//获取当前bash的PID
[root@localhost 桌面]# echo $$ [root@localhost 桌面]# top -d -p top - :: up :, users, load average: 0.02, 0.09, 0.13
Tasks: total, running, sleeping, stopped, 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 : total, free, used, buff/cache
KiB Swap: total, free, used. avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root S 0.0 0.1 :00.29 bash

pstree:查看进程之间的关系

pstree [-A|U] [-up]

参数:

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

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

-p:同时显示PID

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

[root@localhost 桌面]# pstree
systemd─┬─ModemManager───*[{ModemManager}]
├─NetworkManager─┬─dhclient
│ └─*[{NetworkManager}]
├─*[abrt-watch-log]
├─abrtd
├─accounts-daemon───*[{accounts-daemon}]
├─alsactl
├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}
│ └─*[{at-spi-bus-laun}]
├─at-spi2-registr───{at-spi2-registr}
├─atd
├─auditd─┬─audispd─┬─sedispatch
│ │ └─{audispd}
│ └─{auditd}
├─avahi-daemon───avahi-daemon
├─bluetoothd
├─caribou───*[{caribou}]
├─chronyd
├─colord───*[{colord}]
├─crond
├─cupsd
├─*[dbus-daemon───{dbus-daemon}]
├─dbus-launch
├─dconf-service───*[{dconf-service}]
├─dnsmasq───dnsmasq
├─evolution-calen───*[{evolution-calen}]
├─evolution-sourc───*[{evolution-sourc}]
├─gconfd-
├─gdm─┬─Xorg───*[{Xorg}]
│ ├─gdm-session-wor─┬─gnome-session─┬─abrt-applet───{abrt-applet}
│ │ │ ├─gnome-settings-───*[{gnome-settings-}]
│ │ │ ├─gnome-shell─┬─firefox───*[{firefox}]
│ │ │ │ ├─ibus-daemon─┬─ibus-dconf───*[{ibus-dconf}]
│ │ │ │ │ ├─ibus-engine-lib───*[{ibus-engine-lib}]
│ │ │ │ │ ├─ibus-engine-sim───*[{ibus-engine-sim}]
│ │ │ │ │ └─*[{ibus-daemon}]
│ │ │ │ └─*[{gnome-shell}]
│ │ │ ├─gnome-software───*[{gnome-software}]
│ │ │ ├─nautilus───*[{nautilus}]
│ │ │ ├─seapplet
│ │ │ ├─ssh-agent
│ │ │ ├─tracker-extract───*[{tracker-extract}]
│ │ │ ├─tracker-miner-a───*[{tracker-miner-a}]
│ │ │ ├─tracker-miner-f───*[{tracker-miner-f}]
│ │ │ ├─tracker-miner-u───*[{tracker-miner-u}]
│ │ │ └─*[{gnome-session}]
│ │ └─*[{gdm-session-wor}]
│ └─*[{gdm}]
├─geoclue───{geoclue}
├─gnome-keyring-d───*[{gnome-keyring-d}]
├─gnome-shell-cal───*[{gnome-shell-cal}]
├─gnome-terminal-─┬─bash───bash
│ ├─bash───pstree
│ ├─gnome-pty-helpe
│ └─*[{gnome-terminal-}]
├─goa-daemon───*[{goa-daemon}]
├─goa-identity-se───*[{goa-identity-se}]
├─gsd-printer───{gsd-printer}
├─gssproxy───*[{gssproxy}]
├─gvfs-afc-volume───*[{gvfs-afc-volume}]
├─gvfs-goa-volume───{gvfs-goa-volume}
├─gvfs-gphoto2-vo───{gvfs-gphoto2-vo}
├─gvfs-mtp-volume───{gvfs-mtp-volume}
├─gvfs-udisks2-vo───*[{gvfs-udisks2-vo}]
├─gvfsd───{gvfsd}
├─gvfsd-fuse───*[{gvfsd-fuse}]
├─gvfsd-metadata───{gvfsd-metadata}
├─gvfsd-trash───*[{gvfsd-trash}]
├─ibus-x11───*[{ibus-x11}]
├─irqbalance
├─ksmtuned───sleep
├─libvirtd───*[{libvirtd}]
├─lsmd
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─mission-control───*[{mission-control}]
├─packagekitd───*[{packagekitd}]
├─polkitd───*[{polkitd}]
├─pulseaudio───*[{pulseaudio}]
├─rsyslogd───*[{rsyslogd}]
├─rtkit-daemon───*[{rtkit-daemon}]
├─smartd
├─sshd
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tracker-store───*[{tracker-store}]
├─udisksd───*[{udisksd}]
├─upowerd───*[{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 - vi &
[]
[root@localhost 桌面]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
S - wait pts/ :: bash
T - - signal pts/ :: vi
R - - pts/ :: ps []+ 已停止 nice -n - vi
[root@localhost 桌面]# kill - %
[]+ 已杀死 nice -n - 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
S - wait pts/ :: bash
R - - pts/ :: ps
[root@localhost 桌面]# renice
(进程 ID) 旧优先级为 ,新优先级为
[root@localhost 桌面]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
S - wait pts/ :: bash
R - - pts/ :: 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.-.el7.x86_64 # SMP Thu Nov :: UTC x86_64 x86_64 x86_64 GNU/Linux

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

[root@localhost 桌面]# uptime
:: up day, :, 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 192.168.122.1: 0.0.0.0:* LISTEN /dnsmasq
tcp 0.0.0.0: 0.0.0.0:* LISTEN /sshd
tcp 127.0.0.1: 0.0.0.0:* LISTEN /cupsd
tcp 127.0.0.1: 0.0.0.0:* LISTEN /master
tcp6 ::: :::* LISTEN /sshd
tcp6 ::: :::* LISTEN /cupsd
tcp6 ::: :::* LISTEN /master
[root@localhost 桌面]#

dmesg:分析内核产生的信息

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

[root@localhost 桌面]# dmesg | grep -i eth
[ 14.040049] e1000 ::01.0 eth0: (PCI:66MHz:-bit) :0c::7f:dd:
[ 14.040070] e1000 ::01.0 eth0: Intel(R) PRO/ 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 ..c.. (root)bash
root ..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 root 12u unix 0xffff8800359c9a40 0t0 /run/systemd/private
systemd root 20u unix 0xffff880035a87800 0t0 /run/udev/control
systemd root 21u unix 0xffff8800b736f440 0t0 /run/lvm/lvmpolld.socket
systemd root 22u unix 0xffff8800359e0000 0t0 /run/systemd/notify
systemd root 23u unix 0xffff8800359e0b40 0t0 /run/systemd/journal/stdout
systemd root 26u unix 0xffff8800359e0f00 0t0 /run/systemd/journal/socket
systemd root 27u unix 0xffff8800359e12c0 0t0 /dev/log
systemd root 28u unix 0xffff8800b736fbc0 0t0 /run/systemd/shutdownd

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

pidof [-sx] program_name

参数:

-s:尽列出一个PID

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

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

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:
[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

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

第17章 程序管理与SELinux初探的更多相关文章

  1. 第十七章 程序管理与SELinux初探--进程、进程管理(ps、top)

    一个程序被加载到内存当中运行,在内存内的那个数据就被称为进程(process).进程是操作系统上非常重要的概念,所有系统上面跑的数据都会以进程的类型存在.系统进程有哪些状态?不同状态会如何影响系统的运 ...

  2. 鸟哥的linux私房菜——第十六章学习(程序管理与 SELinux 初探)

    第十六章.程序管理与 SE Linux 初探 在 Linux 系统当中:"触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的 ...

  3. 第十七章、程序管理与 SELinux 初探

    ---恢复内容开始--- 什么是程序 (process) 在 Linux 底下所有的命令与你能够进行的动作都与权限有关, 而系统依据UID/GID以及文件的属性相关性判定你的权限!在 Linux 系统 ...

  4. 第十七章、程序管理与 SELinux 初探 工作管理 (job control)

    工作管理 (job control) 这个工作管理 (job control) 是用在 bash 环境下的,也就是说:『当我们登陆系统取得 bash shell 之后,在单一终端机介面下同时进行多个工 ...

  5. 别人的Linux私房菜(17)进程管理与SELinux初探

    程序在磁盘中,通过用户的执行触发.触发事件时,加载到内存,系统将它定义成进程,给予进程PID,根据触发的用户和属性,给予PID合适的权限. PID和登陆者的UID/GID有关.父进程衍生出来的进程为子 ...

  6. 鸟哥私房菜基础篇:程序管理与 SELinux 初探习题

    猫宁!!! 参考:http://cn.linux.vbird.org/linux_basic/0440processcontrol.php 1-简单说明什么是程序 (program) 而什么是程序 ( ...

  7. linux 程序管理与SElinux

    此文涉及的命令:&.jobs.fg.bg.kill.nohup.ps.top.pstree.free.uname.uptime.netstat.dmesg.vmstat.fuser.lsof. ...

  8. linux备忘录-程序管理与SELinux

    知识点 程序与程序(Process and Program) 通过执行一条指令或程序,则可以触发一个事件,并获得一个PID.当我们需要启动一个程序时,我们是启动一个二进制文件(binary file) ...

  9. 程序管理与SElinux

    一.程序: 1.在Linux中,触发任何一个事件是,系统都会将他定义为一个程序,并且给予这个程序一PID,同时依据启发这个程序的使用者与相关属性关系,给予这个PID一组有效的权限设定,从此以后,这个P ...

随机推荐

  1. BugFree后台统计Bug信息

    以下为二维表信息 //统计严重等级Bug SELECT severity,count(severity) FROM `bf_bugview` where product_id=476 GROUP BY ...

  2. 团队展示网页 HTML模版

    之前帮着领导,参加了iGEM的校内赛的网页制作,一开始也是用的现成的模版,但后面修修改改几乎面目全非了- 这里分享一下自己的网站,可以用做团队展示的网页模版,文件在末尾,大家自行下载吧-- 这里贴两张 ...

  3. ubuntu下python在pycharm环境下安装setuptools和pip,和distutils.core

    python安装好后,我们用pycharm安装所需的第三方模块时,出现“Python packaging tools not found. install packaging tools”点击安装输完 ...

  4. Linux入门第二天——基本命令入门(下)

    一.帮助命令 1.帮助命令:man (是manual手册的缩写,男人无所不能,/笑哭) 更多man用法以及man page的用法,参见:http://www.linuxidc.com/Linux/20 ...

  5. GridSQL--Stado 学习初步

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL集群方案相关索引页     回到顶级页面:PostgreSQL索引页 作者  高健@博客园   luckyjackgao ...

  6. day 3 私有属性,私有方法,__del__

    1.隐藏对象的属性 如果有一个对象,当需要对其进行修改属性时,有2种方法 对象名.属性名 = 数据 ---->直接修改 对象名.方法名() ---->间接修改 1)版本1:直接修改 对象的 ...

  7. ElasticSearch 聚合查询百分比

    这里用的是es5.6.9 bucket_script :它执行一个脚本,该脚本可以对多桶聚合中的指定度量执行每桶计算,指定的度量标准必须为数字,并且脚本必须返回数值. 官方语法 https://www ...

  8. Cannot get connection for URL jdbc:oracle:thin:调用中无效参数

    这个报错明显是连接数据库的url没有写对,但是,我要说的是但是,同样的代码生产没有问题,而测试环境报错了.最终哥找到那个错误,jdbc连接数据库时,有ResultSet,PreparedStateme ...

  9. HTTP简单教程

    目录 HTTP简介 HTTP工作原理 HTTP消息结构 客户端请求消息 服务器响应消息 实例 HTTP请求方法 HTTP响应头信息 HTTP状态码 HTTP状态码分类 HTTP状态码列表 HTTP c ...

  10. Qt 利用XML文档,写一个程序集合 一

    接到领导需求安排,说公司未来的硬件设备会越来越多,与每个设备对应的设备检测和设置程序也会增多.导致软甲太多,不好掌控.所以希望做一个完整的软件,但是呢,每个子程序还得独立,应为每个用户购买的设备不是一 ...