[TOC]
HUP进程(Process):就是正在运行的程序
描述:用于报告进程使用的文件和网络套接字,还可以用指定的文件或者文件系统显示进程进程号,默认情况下每一个文件名后会跟着一个字母来表示类型,那些本地进程使用file参数指定的本地或远程文件。
命令安装:
Psmisc软件包包含三个帮助管理/proc目录的程序
yum install psmisc -y #可以安装下列程序: fuser, killall,pstree和pstree.x11(到pstree的链接)
语法参数:
# USage:
fuser [-fMuvw] [-a|-s] [-4|-6] [-c|-m|-n SPACE] [-k [-i] [-SIGNAL]] NAME...
-4 IPv4
-6 IPv6
-a:显示命令行中指定的所有文件;
-k:杀死访问指定文件的所有进程;
-i:杀死进程前需要用户进行确认;
-l:列出所有已知信号名;
-m:指定一个被加载的文件系统或一个被加载的块设备;
-n:选择不同的名称空间,指定关键字进行搜索,如 文件、UDP、TCP
-u:在每个进程后显示所属的用户名。
-s 不显示处理信息
-u PID显示用户名
-v 运行时,显示相信处理信息
- 清零
-m 挂载文件系统
-signal 发送信号
-V 显示版本显示
#对于阻塞特别设备,此命令列出了使用该设备上任何文件的进程。
c:指示进程的工作目录。
e:指示该文件为进程的可执行文件(即进程由该文件拉起)。
f:指示该文件被进程打开,默认情况下f字符不显示。
F:指示该文件被进程打开进行写入,默认情况下F字符不显示。
r:指示该目录为进程的根目录。
m:指示进程使用该文件进行内存映射,抑或该文件为共享库文件,被进程映射进内存。
实际案例:
#示例1.显示支持的信号,使用最多的是
fuser -l #HUP 平滑启动
#示例2. 要列出使用/etc/passwd文件的本地进程的进程号与用户登录名称
fuser /etc/passwd
fuser -u /etc/passwd
#实例3.进程操作并获取进程对应的 PID
fuser -a /etc/passwd ##显示与/etc/passwd 目录相关的进程
fuser -k /etc/passwd ##杀死与/etc/passwd 目录相关的进
#示例5.根据通信协议和端口来看pid信息
fuser -nv tcp 80 #指定名称空加端口,显示器进程信息
# 端口/协议: 进程PID 当前连接的PID
# 80/tcp: 1005 28805
fuser -k -n tcp 80 # 会终止该端口号进程
#示例4.任一命令都列出了进程号和用户名,然后终止每个正在使用/dev/hd1 (/home)文件系统的进程。仅有root用户能终止属于另一用户的进程。
#如果您正在试图卸下/dev/hd1文件系统,而一个正在访问/dev/hd1文件系统的进程不允许这样,您可能希望使用此命令
fuser -k -u -c /dev/hd1 或者 fuser -kuc /home #注意使用啊,貌似会关闭终端
fuser -km /www #快速停止占用(根据挂载的目录)
描述:在Linux系统中PS(Process Status的缩写)命令常常用来用来列出系统中当前运行的进程,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等;,总之大部分信息都是可以通过执行该命令得到的。
Tips: Linux上进程有5种状态:
命令参数:
-a:显示所有终端机下执行的程序,除了阶段作业领导者之外。
a:显示现行终端机下的所有程序,包括其他用户的程序。
-A:显示所有程序。
-c:显示CLS和PRI栏位。
c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。
-C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。
-d:显示所有程序,但不包括阶段作业领导者的程序。
-e:此选项的效果和指定"A"选项相同。
e:列出程序时,显示每个程序所使用的环境变量。
-f:显示UID,PPIP,C与STIME栏位。
f:用ASCII字符显示树状结构,表达程序间的相互关系。
-g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。
g:显示现行终端机下的所有程序,包括群组领导者的程序。
-G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。
h:不显示标题列。
-H:显示树状结构,表示程序间的相互关系。
-j或j:采用工作控制的格式显示程序状况。
-l或l:采用详细的格式来显示程序状况。
L:列出栏位的相关信息。
-m或m:显示所有的执行绪。
n:以数字来表示USER和WCHAN栏位。
-N:显示所有的程序,除了执行ps指令终端机下的程序之外。
-p<程序识别码>:指定程序识别码,并列出该程序的状况。
p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。
r:只列出现行终端机正在执行中的程序。
-s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。
s:采用程序信号的格式显示程序状况。
S:列出程序时,包括已中断的子程序资料。
-t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。
t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。
-T:显示现行终端机下的所有程序。
-u<用户识别码>:此选项的效果和指定"-U"选项相同。
u:以用户为主的格式来显示程序状况。
-U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。
U<用户名称>:列出属于该用户的程序的状况。
v:采用虚拟内存的格式显示程序状况。
-V或V:显示版本信息。
-w或w:采用宽阔的格式来显示程序状况
-o: 指定显示进程的信息以列为主
x:显示所有程序,不以终端机来区分。
X:采用旧式的Linux i386登陆格式显示程序状况。
-y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。
-<程序识别码>:此选项的效果和指定"p"选项相同。
--cols<每列字符数>:设置每列的最大字符数。
--columns<每列字符数>:此选项的效果和指定"--cols"选项相同。
--cumulative:此选项的效果和指定"S"选项相同。
--deselect:此选项的效果和指定"-N"选项相同。
--forest:此选项的效果和指定"f"选项相同。
--headers:重复显示标题列。
--lines<显示列数>:设置显示画面的列数。
--no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。
--group<群组名称>:此选项的效果和指定"-G"选项相同。
--Group<群组识别码>:此选项的效果和指定"-G"选项相同。
--pid<程序识别码>:此选项的效果和指定"-p"选项相同。
--rows<显示列数>:此选项的效果和指定"--lines"选项相同。
--sid<阶段作业>:此选项的效果和指定"-s"选项相同。
--tty<终端机编号>:此选项的效果和指定"-t"选项相同。
--user<用户名称>:此选项的效果和指定"-U"选项相同。
--User<用户识别码>:此选项的效果和指定"-U"选项相同。
--version:此选项的效果和指定"-V"选项相同。
--widty<每列字符数>:此选项的效果和指定"-cols"选项相同。
格式头说明:
USER PID PPID(父进程) C(进程占用CPU的百分比 ) %CPU(占用的CPU) %MEM(占用的内存) VSZ(占虚拟内存KB) RSS(占物理内存KB) TTY(终端)STAT(进程状态)START(占用实时间) STIME(进程启动的时间) TIME COMMAND
root 7248 0.0 0.0 110104 864 tty1 Ss+ 14:06 0:00 /sbin/agetty --noclear tty1 linux
格式说明:
PID:进程标识符,系统为每一个进程分配一个识别码,称为PID
VSZ:该进程使用的虚拟內存量(KB)
RSS:该进程占用的固定內存量(KB)(驻留中页的数量) (RSS is the “resident set size” meaning physical memory used)
START:该进程的启动时间
TIME:该进程占用CPU的运算时间,注意不是系统时间;
TTY:linux 中tty1~tty6表示本地字符终端 tty7图形终端 pts/0 -255虚拟终端很多都是?表示很多进程都是系统进程
串行端口终端(/dev/ttySn)
伪终端(/dev/pty/)
控制终端(/dev/tty)
控制台终端(/dev/ttyn, /dev/console)
虚拟终端(/dev/pts/n)
COMMAND:产生此进程的命令名
STAT状态位常见的状态字符有:
D //无法中断的休眠状态(通常 IO 的进程)
R(running) //正在运行可中在队列中可过行的
S(sleeping) //处于休眠状态
T(terminate) //停止或被追踪
W //换出,进入内存交换 (从内核2.6开始无效)
X //死掉的进程 (基本很少见)
Z //僵尸进程;
< //优先级高的进程
N //优先级较低的进程
L //有些页被锁进内存;
s //进程的领导者(在它之下有子进程)
l //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads)
P //等待交换页
I //(idle) 空闲
+ //位于后台的进程组
实际案例:
#示例1.显示每个环节变量,以accii树形显示并且不显示标题
$ps efh #以System V风格显示进程
7231 pts/1 Ss 0:00 -bash USER=root LOGNAME=root HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr
7291 pts/1 R+ 0:00 \_ ps efh XDG_SESSION_ID=31 HOSTNAME=localhost.localdomain TERM=xterm SHELL=/bi
7248 tty1 Ss+ 0:00 /sbin/agetty --noclear tty1 linux LANG= PATH=/usr/local/sbin:/usr/local/bin:/usr
$ps aux #最初用在Unix Style中
#显示所有进程,还有状态显示(与ps -A的区别)
ps x | head -n 2
# PID TTY STAT TIME COMMAND
# 1 ? Ss 0:17 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
#示例2.显示执行的命令uid以及PID和父进程 (常用)
ps -ef #UID-PID-Command
ps -ef | grep firefox
# UID PID PPID C STIME TTY TIME CMD
# root 1 0 0 6月11 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deseria
#示例3.采用linux标准命令格式查看进程执行的cmd命令
ps -le
# -l 长格式显示。显示更加详细的信息
# -e 显示所有进程和-A作用一致
# F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
# 4 S 0 1 0 0 80 0 - 31359 ep_pol ? 00:00:01 systemd
ps -p 7193
# PID TTY TIME CMD
# 7193 ? 00:00:00 sshd
#实例4.线程的子线程查看
$ps -p 30520
$ps -P 30520 #列表格式差异
PID TTY TIME CMD
30520 ? 00:00:00 docker-proxy
$ps -Hp 30520
PID PSR TTY STAT TIME COMMAND
30520 3 ? Sl 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9002 -container-ip 172.18.0.4 -container-port 3306
#实例5.指定显示进程的某些信息
ps -o %cpu,%mem,user,group,comm,nice,pid,stat
%CPU %MEM USER GROUP COMMAND NI PID STAT
0.0 0.0 root root bash 0 5443 Ss
0.0 0.0 root root ps 0 5492 R+
[root@vm-1575613390 ~]# ps -a -o %cpu,%mem,user,group,comm,
# 实例6.进程条件过滤
# 1.CPU占用最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k3|head -10
# 2.内存消耗最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k4|head -10
# 3.虚拟内存使用最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k5|head -10
# 4.RSS是“驻留集大小”表示使用的物理内存最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k6|head -10
# 5.按照进程运行时间进行倒序排序显示
ps auxw|head -1;ps auxw|sort -rn -k2|head -10
# 6.按进程消耗内存多少排序的方法
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | sort -k5nr
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' --sort -rsz
# PID COMMAND COMMAND %CPU RSZ VSZ STIME USER UID
# 503 systemd-journal /lib/systemd/systemd-journa 0.0 140656 518176 Feb10 root 0
WeiyiGeek.psaux
描述:以树状图的方式展现进程之间的派生关系,显示效果比较直观;
安装方式:
#RHEL/CentOS
yum install psmisc
#Debian/Ubuntu
apt install psmisc
基础语法参数:
# 语法:
pstree(选项)
# 参数:
-a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示;
-c:不使用精简标示法;
-G:使用VT100终端机的列绘图字符;
-h:列出树状图时,特别标明现在执行的程序;
-H<程序识别码>:此参数的效果和指定"-h"参数类似,但特别标明指定的程序;
-l:采用长列格式显示树状图;
-n:用程序识别码排序。预设是以程序名称来排序;
-p:显示程序识别码;PID
-u:显示用户名称;UID
-U:使用UTF-8列绘图字符;
-V:显示版本信息。
实际案例:
#示例1.简单示例
pstree # init 进程 systemd 为系统的 PID 1 号进程,所有的进程都在 systemd 的管理之下。
pstree -u
pstree -p # 显示当前所有进程的进程号和进程id
pstree -a # 显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。
WeiyiGeek.pstree
描述:以名称为依据从运行进程队列中查找进程,并显示查找到的进程id;每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合
基础语法参数:
#语法
pgrep [选项] <进程名> # 显示进程的PID
# 参数
-o:仅显示找到的最小(起始)进程号;
-n:仅显示找到的最大(结束)进程号;
-l:显示进程名称;
-P:指定父进程号;
-g:指定进程组;
-t:指定开启进程的终端;
-u:指定进程的有效用户ID。
实际案例:
#示例1.进程名称:指定要查找的进程名称,同时也支持类似grep指令中的匹配模式.
pgrep sshd
pgrep -f sshd
5460
7220
7222
#示例2.显示进程及其名称
pgrep -l ssh
5460 sshd
7222 sshd
7335 sshd
7337 sshd
#示例3.显示最小最大的进程号
$pgrep -lo sshd
5460 sshd
$pgrep -ln sshd
7222
#示例4.显示指定UID的用户
$pgrep -au root #root用户
5779 /usr/sbin/smbd --foreground --no-process-group
5780 /usr/sbin/smbd --foreground --no-process-group
5781 /usr/sbin/smbd --foreground --no-process-group
描述:能可以根据可执行进程来快速找到进程的PID号
#语法
pidof [-s] [-c] [-n] [-x] [-m] [-o omitpid[,omitpid..]] [-o omitpid[,omitpid..]..]
program [program..] # 进程名称:指定要查找的进程名称。
-s:仅返回一个进程号;
-c:仅显示具有相同“root”目录的进程;
-x:显示由脚本开启的进程;
-o:指定不显示的进程ID。
实际案例:
#示例1.显示服务相关的进程
$pidof sshd
7195 7193 5459
#示例2.只显示一个进程号
$pidof -s httpd
47365
描述:此命令可以通过PID找出程序的绝对路径,在查找某个java编写的程序运行情况可通过jps命令查看,然后可以通过显示的pid进行程序定位;
使用说明:
#(1)找到mysqld进程pid标识然后找绝对路径
$top -n2 -d2
# 30337 polkitd 20 0 2701192 485928 21608 S 0.3 12.5 75:08.94 mysqld
$pwdx 30337
30337: /var/lib/mysql
注意事项:
(1) pidof命令必须输入正确的进程名,如果输入进程名不全,则显示为空。而pgrep命令获取进程ID时,是可以不需要输入准确的进程名。验证效果如下命令所示:
(2) 通过/proc/进程id/
下面的进程相关文件进行查看进程信息
# 进程执行
$cat /proc/26195/cmdline | tr \'\0\' \' \'
./bt_uinfo_memcached -p 20211 -u root -l 0.0.0.0 -m 3072 -d root@ubuntu:~#
# 进程zhun
$cat /proc/26195/status | tr \'\0\' \' \'
Name: bt_uinfo_memcac
State: S (sleeping)
# 进程信息
$cat /proc/26195/stat
26195 (bt_uinfo_memcac) S 1 26195 26195 0 -1 4202560 42735 0 0 0 3517 5339 0 0 20 0 6 0 293270594 475316224
36956 18446744073709551615 1 1 0 0 0 0 0 4097 2 18446744073709551615 0 0 17 9 0 0 0 0 0
# 进程执行路径
$sudo ls -l /proc/27628/exe
lrwxrwxrwx 1 root root 0 2013-05-29 16:00 /proc/27628/exe -> /home/dspeak/myshard/2013/room_1_0/bin/shard_d
描述:该命令可在进程间通信设施,调用进程具有读取访问lsipc节目信息。
基础示例:
# 示例1.查看消息队列/共享内存/信号量
$lsipc
RESOURCE DESCRIPTION LIMIT USED USE%
MSGMNI 消息队列数量 7572 0 0.00%
MSGMAX 消息的最大大小(字节) 8192 - -
MSGMNB 默认最大队列大小(字节) 16384 - -
SHMMNI 共享内存段 4096 2 0.05%
SHMALL 共享内存页 18446744073692774399 178 0.00%
SHMMAX 共享内存段的最大大小(字节) 18446744073692774399 - -
SHMMIN 共享内存段的最小大小(字节) 1 - -
SEMMNI 信号量标识符的数目 128 2 1.56%
SEMMNS 信号量总量 32000 28 0.09%
SEMMSL 每个信号量集的最大信号量。 250 - -
SEMOPM 每个semop的最大操作数 32 - -
SEMVMX 信号量最大值 32767 - -
描述:pmap 工具主要用于报告进程“内存映射”情况,指定需要显示内存映射关系的进程号,可以是多个进程号。
语法参数
# SYNOPSIS
pmap [options] pid [...]
# OPTIONS
-x, --extended : 显示扩展格式
-d, --device : 显示设备格式
-q, --quiet : 不显示头信息
-A, --range low,high : Limit results to the given range to low and high address range. Notice that the low and high arguments are single string separated with comma.
-X : Show even more details than the -x option. WARNING: format changes according to /proc/PID/smaps
-XX : Show everything the kernel provides
-p, --show-path : Show full path to files in the mapping column
-c, --read-rc : Read the default configuration
-C, --read-rc-from file : Read the configuration from file
-n, --create-rc : Create new default configuration
-N, --create-rc-to file : Create new configuration to file
使用示例:
# 1.显示进程扩展格式
$ pidof dockerd
# 3220194
$ pmap -x 3220194
# 3220194: /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# Address Kbytes RSS Dirty Mode Mapping
# 000000c000000000 10240 9244 9240 rw--- [ anon ]
# 000000c000a00000 24576 5736 5732 rw--- [ anon ]
# ....
# 000055ad65318000 24764 0 0 r---- dockerd
# ....
# 00007f14bc007000 16 0 0 r---- libresolv-2.31.so (deleted)
# 00007f14bc00b000 64 0 0 r-x-- libresolv-2.31.so (deleted)
# ....
# 00007ffe84662000 132 4 4 rw--- [ stack ]
# ---------------- ------- ------- -------
# total kB 2196164 39852 25784
# 2.统计dockerd进程占用的物理内存。
$ cat /proc/3220194/smaps | grep '^Rss:' | awk '{sum +=$2} END{print sum}'
39852
描述:用来在Linux杀死执行中的程序或工作进程的命令, kill可将指定的信息送至程序,预设的信息为SIGTERM(15),可将指定程序终止,若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序->程序或工作的编号可利用ps指令或job指令查看
#语法
kill [信号代码] <进程PID/作业识别号>
#参数
-a:当处理当前进程时,不限制命令名和进程号的对应关系;
-l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称;
-p:指定kill 命令只打印相关进程的进程号,而不发送任何信号;
-s <信息名称或编号>:指定要送出的信息;
-u:指定用户。
实际案例:
#示例1.显示所有信号名称,只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略
kill -l
#下面是常用的信号:根据PID向进程发送信号,常用来结束进程,默认信号为-9
-l [信号数字]显示、翻译信号代码
-1 , -HUP 挂起,终端断线
-2 , -INT 从键盘中断中断(同 Ctrl + C)
-3 , -QUIT 从键盘退出退出(同 Ctrl + \\)
-4 , -ILL 非法指令
-6 , -ABRT 发送abort 信号退出
-9 , -KILL 强制终止
-11 , -SEGV 内存错误
-13 , -PIPE 破坏管道
-14 , -ALRM
-15 , -TERM 发送Termination 信号 终止
-19 , -STOP 停止进程,但不结束( Ctrl+z )
-18 , -CONT 继续运行已停止的进程(与-stop相反,fg/bg命令)
#示例2.进程终止
#先用ps命令来查看该进程对应的PID,可以看到该进程对应的PID是345,现在使用kill命令来终止该进程.
#345 1 00:00:00 find / -name foxy.jpg
kill 345
kill -l 223 #重启进程
kill -9 2236 #强制结束进程
kill -s 9 2236
#示例3.平滑重启服务,不会跳出当前登录用户
kill -HUP 1523
#示例4.关闭读取配置文件后重启(平滑重启)
kill -SIGHUP $(pidof dockerd)
#示例5.指定停止后台执行的任务
jobs
kill %1 #这里的数字是按照jobs返回的数字
补充说明:
Q:SIGINT、SIGKILL和SIGTERM区别?
让程序友好的退出
,当程序未退出时,可以使用kill -9
强制退出;描述:该命令会结束进程族,如果结束单个进程请用kill
,其检查的是 /proc/ 下面的 pid 目录的 cmdline 文件和 status 文件;
# 语法
pkill (选项) (参数)
# 参数
-o:仅向找到的最小(起始)进程号发送信号;
-n:仅向找到的最大(结束)进程号发送信号;
-P:指定父进程号发送信号;
-g:指定进程组;
-t:指定开启进程的终端, (用户踢出)
实际案例:
#示例1.结束所有有关于firefox的进程;
pkill firefox
#实例2.结束多余的用户会话(重要)
$w
pkill -9 -t tty1 #只有超级用户才能剔除用户
pkill -9 -t pts/1 #远程终端
#示例3.使用进程名称直接kill掉
pkill -f name
描述:killall 和 pkill 应用方法差不多也是直接杀死运行中的程序把这ps和grep两个过程合二为一; 它查看的是 /proc/pid/stat 文件内容;如果您想杀掉单个进程请用kill 来杀掉.
语法&参数:
# 安装
yum install psmisc -y
# 语法
killall [选项] [信号] <进程名>
# 参数
-e:对长名称进行精确匹配;
-l:忽略大小写的不同;
-p:杀死进程所属的进程组;
-i:交互式杀死进程,杀死进程前需要进行确认;
-l:打印所有已知信号列表;
-q:如果没有进程被杀死。则不输出任何信息;
-r:使用正规表达式匹配要杀死的进程名称;
-s:用指定的进程号代替默认信号“SIGTERM”;
-u:杀死指定用户的进程。
实际操作:
#示例0.查看进程信号
killall -l
HUP # 挂起,终端断线
INT # 从键盘中断中断(同 Ctrl + C)
QUIT # 从键盘退出退出(同 Ctrl + \\)
ILL TRAP ABRT IOT BUS FPE
KILL # 终止信号
USR1 SEGV USR2 PIPE ALRM
TERM # 发送Termination 信号 终止
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED
#示例1.删除所有的同名进程显示信号量
killall vi #杀死所有同名进程
#示例2.删除apache2得一个进程组:
killall -g apache2
描述:killall5是SystemV killall命令,它向所有进程发送一个信号,除了内核线程和它自己会话中的进程,所以它不会杀死运行脚本的shell。 killall5也可以作为pidof调用,它只是一个指向killall5程序的(符号)链接。
注意: 不要直接执行该命令,如果执行会向所有进行发送一个关闭信号会直接导致机器宕掉;
基础语法:
killall5 -signalnumber [-o omitpid[,omitpid..]] [-o omitpid[,omitpid..]..]
# 常用参数
-o 省略具有该进程id的进程
# 返回值
如果程序终止进程,则返回零。
如果没有进程被杀死,它返回2。
如果无法找到任何进程(/proc/丢失)返回1
基础示例:
# 示例1.杀死除1122外外的所有进程
killall5 -o 1122
CPU 在同一个时间只能执行一个指令,顺序由进程优先级来排序,数字越小优先级越高
#如ps -le命令中可以看见
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 31359 ep_pol ? 00:00:01 systemd
4 S 0 7339 7337 0 80 0 - 18050 poll_s ? 00:00:00 sftp-server
PRI:Priority #优先权
NI:Nice #精密的
修改NI值的几个注意事项: 1)NI的值范围-20~19 2)普通用户调制NI值范围0~19而且只能调整自己的进程 3)普通用户只能调高NI,而不能降低NI值 4)root用户才能设定NI值为负值,而且可以调整任何用户的进程;计算:PRI(最终值)= PRI(原始值) + NI 5)用户只能修改NI 不能直接修改PRI
描述:用于以指定的进程调度优先级启动其他的程序,nice命令可以给新执行的命令直接赋予NI值,但不能修改已经存在的进程NI值.
用法:nice [选项] [命令 [参数] ]
-n:指定进程的优先级(整数)。
实际案例:
#1.新建一个进程并设置优先级,将当前目录下的documents目录打包,但不希望tar占用太多CPU:
nice -19 tar zcf pack.tar.gz documents
#方法非常简单,即在原命令前加上nice -19。很多人可能有疑问了,最低优先级不是19么?
#那是因为这个“-19”中的“-”仅表示参数前缀;所以如果希望将当前目录下的documents目录打包,并且赋予tar进程最高的优先级:
nice --19 tar zcf pack.tar.gz documents
#示例2.将httpd启动加入优先级
nice -n -5 service httpd start #加入优先级
描述:修改正在运行的进程的调度优先级,预设是以程序识别码指定程序调整其优先权,您亦可以指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权
#语法参数
renice [优先级] PID [选项]
-g:指定进程组id;
-p<程序识别码>:改变该程序的优先权等级,此参数为预设值。
-u:指定开启进程的用户名。
实际案例:
# 将行程id为987及32的行程与行程拥有者为daemon及root的优先序号码加1:
renice 1 987 -u daemon root -p 32 #注意:每一个进程都有一个唯一的id。
描述:/usr/bin/unshare
是Linux自带的命令实际通过unshare()系统调用实现的,调用的主要作用就是不启动一个新进程就可以起到隔离效果,简单的说就是跳出原先的namespace进行操作,使得原进程就可以进行一些需要改隔离的操作;
unshare() 在 C 语言库中的声明如下:
#define _GNU_SOURCE
#include <sched.h>
int unshare(int flags);
基础语法:
用法:
unshare [options] <program> [<argument>...]
选项:
-m, --mount unshare mounts namespace
-u, --uts unshare UTS namespace (hostname etc)
-i, --ipc unshare System V IPC namespace
-n, --net unshare network namespace
-p, --pid unshare pid namespace
-U, --user unshare user namespace
-f, --fork 执行unshare的进程fork一个新的子进程,在子进程里执行unshare传入的参数
--mount-proc[=<dir>] mount proc filesystem first (implies --mount)
-r, --map-root-user 将当前用户映射到根用户(暗指--user)
--propagation <slave|shared|private|unchanged>
modify mount propagation in mount namespace
-s, --setgroups allow|deny control the setgroups syscall in user namespaces
基础示例:
# 1.隔离mnt的Namespace
unshare --mount /bin/bash
# 2.隔离ipc的Namespace
unshare --ipc /bin/bash
# 3.把当前进程的 user namespace 设置成了 root
unshare -u sh -c whoami
root
# 4.该命令unshares一个或多个名称空间,并执行该命令在其命令行参数提供,实现取消共享
$ readlink /proc/$$/ns/mnt
mnt:[4026531840]
$ sudo ./unshare -m /bin/bash
$ readlink /proc/$$/ns/mnt
mnt:[4026532325]
# 5.进程fork一个新的子进程有新的pid,因为子进程已经隔离了pid namespace所以子进程的ps 无法看到父进程里能看到的那些进程列表。
sudo unshare --fork --pid --mount-proc bash
ps -ejf
UID PID PPID PGID SID C STIME TTY TIME CMD
root 1 0 1 0 0 11:39 pts/0 00:00:00 bash
root 27 1 27 0 0 11:39 pts/0 00:00:00 ps -ejf