第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)。
- 首先,我們觸發一個可執行的目標檔案,那就是具有 crond_exec_t 這個類型的 /usr/sbin/crond 檔案;
- 該檔案的類型會讓這個檔案所造成的主體程序 (Subject) 具有 crond 這個領域 (domain), 我們的政策針對這個領域已經制定了許多規則,其中包括這個領域可以讀取的目標資源類型;
- 由於 crond domain 被設定為可以讀取 system_cron_spool_t 這個類型的目標檔案 (Object), 因此你的設定檔放到 /etc/cron.d/ 目錄下,就能夠被 crond 那支程序所讀取了;
- 但最終能不能讀到正確的資料,還得要看 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
后面内容暂时省略,难度较大,需要时再补上。