Linux进程简介
进程就是系统未完成并且正在进行的工作 程序( program)
通常为二进制程序放置在存储媒介中(如硬盘、光盘、软盘、磁带等),物理文件的形式存在 进程(process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载到内存中,操作系统并给子这个内存内的单元一个标识符(PD),可以说,进程就是一个正在运行中的程序。
查看进程ps
1)图形方式查看
gnome-system-monitor
进程查看命令 ps
| |
---|
A | 所有进程 |
u | 在环境中的所有进程,不包函环境信息 |
a | 显示进程用户信息 |
x | 显示当前环境中运行的进程,包含环境信息 |
f | 列出系统中所有运行包含tty输出设备 |
e | 显示进程的详细信息(系统资源的调用 |
ps aux
ps ef
pstree
ps常用组合
| |
---|
ps aux | 显示系统中所有进程并显示进程用户 |
ps ef | 显示进程详细信息并显示进程父子关系 |
ps ax | 显示当前系统中的所有进程 |
pstree | 显示当前系统的进程树 |
ps显示出来的数据 | |
---|
F | 代表这个进程标志( process flags),说明这个进程的权限,常见号码有 |
R | 该进程正在运行中 |
S | 该进程目前正在睡眠状态(idle),但可以被唤醒( signal) |
D | 不可被唤醒的睡眠状态,通常这个进程可能在等待O的情况 |
T | 停止状态(stop),可能是在工作控制(后台暂停)或除错( traced)状态 |
Z | :“僵尸”状态,进程已经终止但却无法被删除至内存外 |
/UID/PID | 代表此进程被该UID/所拥有进程的PID号码/此进程的父进程PD号码 |
C | 代表CPU使用率,单位为百分比 |
PINI | riority/Nice的缩写,代表此进程被CPU所执行的优先级,数值越小代表该进程 越快被CPU执 行 |
TTY | 登录者的终端机位置,若为远程登录则使用动态终端接口 |
TME | 使用掉的CPU时间,注意,是此进程实际花费CPU运行的时间,而不是系统时间。 |
CMD | 就是 command的缩写,造成此程序的触发进程的命令为何 |
| |
显示进程指定信息
ps -o xxx | 显示进程的指定信息 |
---|
comm | 进程名称 |
user | 进程所有人 |
group | 进程所有组 |
%cpu | 进程cpu使用率 |
%mem | 进程使用率 |
pid | 进程id |
nice | 进程优先级 |
ps进程排序
ps ax --sort=
+%cpu|-%cpu 按照CPU的使用率排序
+%mem|-%mem
stat中显示的信息
| |
---|
S | 进程状态 |
I | 内存中有锁定空间 |
N | 优先级低 |
< | 优先级高 |
+ | 前台运行 |
s | 顶级进程 |
查看进程优先级
进程的优先级范围 -20~19
优先级查看
ps ax -o pid,nice,comm
指定某个优先级开启进程
nice -n 优先级数字 进程名称
nice -n -5 vim 开启vim并且指定程序优先级为-5 (之前没有)
改变已有进程优先级
reince -n 优先级数字 进程pid
renice -n -5 1806 | 改变1806进程的优先级为-5 |
---|
环境中进程的前后台调用
| |
---|
jobs | 查看被打入环境后台的进程 |
ctrl+z | 把占用终端的进程打入后台 |
fg jobsnum | 把后台进程调回前台 |
bg jobsnum | 把后台暂停的进程运行 |
comm & | 让命令直接在后台运行 |
进程信号
常用信号等级
man 7 signal 查看信号详细信息
| |
---|
1 | 进程重新加载配置 |
2 | 删除进程在内存中的数据 |
3 | 删除鼠标在内存中的数据 |
9 | 强行结束单个进程(不能被阻塞) |
15 | 正常关闭进程 (可能会被阻塞) |
18 | 运行暂停的进程 |
19 | 暂停某个进程 (不能被阻塞) |
20 | 把进程打入后台 (可以被阻塞) |
结束进程
kill -9 进程pid
killall -9 进程名字
pkill -u student -信号
先打开三个vim并打入后台
此时查看最后10行的进程
删除pid为2868的进程后再次查看,可以看到已经没有了
当执行killall命令后,可以看到vim进程全部消失
连续三次切换用户,用监控命令查看,再pkill执行命令,进程全部被关闭
进程的动态监控
top
| |
---|
l | 显示cpu每个核的负载 |
s | 调整刷新频率 |
c | CPU负载排序 |
m | 内存使用量排序 |
h | 查看帮助 |
u | 查看指定用户进程 |
k | 对指定进程发起信号 |
q | 退出 |
控制服务
systemd
它的设计目标是,为系统的启动和管理提供一套完整的解决方案。
根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。
使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1), 其他进程都是它的子进程。
systemctl --version查看 Systemd 的版本。
- 优点是功能强大,使用方便,
- 缺点是体系庞大,非常复杂。
| |
---|
systemctl | 服务控制命令 |
systemctl status sshd | 查看服务状态,inactive(不可用),active(可用) |
systemctl start sshd | 开启服务 |
systemctl stop sshd | 关闭服务 |
systemctl restart sshd | 重启服务 |
systemctl reload sshd | 重新加载服务配置 |
systemctl enable sshd | 设定服务开机启动 |
systemctl disable sshd | 列出已经开启服务当前状态 |
systemctl list-units | 列出所有服务开机启动的状态 |
systemctl list-dependencies | 列出服务的倚赖 |
systemctl set-default multi-user.target | 设定系统启动级别为多用户模式(无图形) |
systemctl set-default graphical.target | 设定系统启动级别为图形模式 |
| |
---|
is-active | 目前有没有正在运行中。 |
is-enable | 开机时有没有默认要启用这个 unit。 |
kill | 不要被 kill 这个名字吓着了,它其实是向运行 unit 的进程发送信号。 |
show | 列出 unit 的配置。 |
mask | 注销 unit,注销后你就无法启动这个 unit 了。 |
unmask | 取消对 unit 的注销。 |
sysctl
-
sysctl命令用于运行时配置内核参数,这些参数位于/proc/sys目录下。
-
sysctl配置与显示在/proc/sys目录中的内核参数.可以用sysctl来设置或重新设置联网功能,如IP转发、IP碎片去除以及源路由检查等。
-
用户只需要编辑/etc/sysctl.conf文件,即可手工或自动执行由sysctl控制的功能。
命令参数 | |
---|
-w | 临时改变某个指定参数的值, |
-a | 显示所有的系统参数 |
-p | 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载 |
运行原理
在系统启动时,systemd-sysctl会根据以下的配置文件读取sysctl内核参数:
/etc/sysctl.d/*.conf
/run/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
配置文件的格式是一系列"KEY=VALUE"行(每行一对)。
空格和以"#“或”;"开头的行都会被忽略。
配置文件依次从/etc/,/run/,/usr/lib目录中读取,配置文件的名称必须符合filename.conf格式。对于不同目录下的同名配置文件,仅以优先级最高的目录中的那一个为准。
具体说来,就是/etc/的优先级最高,/run/的优先级居中,/usr/lib的优先级最低。
启用IP路由转发功能
命令行只是临时设置
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1
永久保留配置,可以修改/etc/sysctl.conf文件,
将 net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1
sysctl -p 重新加载系统参数
可以使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量。
sysctl变量的设置通常是字符串、数字或者布尔型(布尔型有1来表示yes,用0来表示no)。
sysctl -w kernel.sysrq=0
sysctl -w kernel.core_uses_pid=1
sysctl -w net.ipv4.conf.default.accept_redirects=0
sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv4.conf.default.rp_filter=1
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_synack_retries=2
sysctl -w net.ipv4.tcp_keepalive_time=3600
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_sack=1
| |
---|
net.ipv4.ip_forward = 0 | 禁用包过滤功能 |
net.ipv4.conf.default.rp_filter = 1 | 启用源路由核查功能 |
net.ipv4.conf.default.accept_source_route = 0 | 禁用所有IP源路由 |
kernel.sysrq = 0 | 使用sysrq组合键是了解系统目前运行情况,为安全起见设为0关闭 |
kernel.core_uses_pid = 1 | 控制core文件的文件名是否添加pid作为扩展 |
net.ipv4.tcp_syncookies = 1 | 开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理 |
kernel.msgmnb = 65536 | 每个消息队列的大小(单位:字节)限制 |
kernel.msgmax = 65536 | 整个系统最大消息队列数量限制 |
kernel.shmmax = 68719476736 | 单个共享内存段的大小(单位:字节)限制,计算公式64G10241024*1024(字节) |
kernel.shmall = 4294967296 | 所有内存大小(单位:页,1页 = 4Kb),计算公式16G10241024*1024/4KB(页) |
net.ipv4.tcp_max_tw_buckets = 6000 | timewait的数量,默认是180000 |
net.ipv4.tcp_sack = 1 | 开启有选择的应答 |
net.ipv4.tcp_window_scaling = 1 | 支持更大的TCP窗口. 如果TCP窗口最大超过65535(64K), 必须设置该数值为1 |
net.ipv4.tcp_rmem = 4096 131072 1048576 | TCP读buffer |
net.ipv4.tcp_wmem = 4096 131072 1048576 | TCP写buffer |
net.core.wmem_default = 8388608 | 为TCP socket预留用于发送缓冲的内存默认值(单位:字节) |
net.core.wmem_max = 16777216 | 为TCP socket预留用于发送缓冲的内存最大值(单位:字节) |
net.core.rmem_default = 8388608 | 为TCP socket预留用于接收缓冲的内存默认值(单位:字节) |
net.core.rmem_max = 16777216 | 为TCP socket预留用于接收缓冲的内存最大值(单位:字节) |
net.core.netdev_max_backlog = 262144 | 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目 |
net.core.somaxconn = 262144 | web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值 |
net.ipv4.tcp_max_orphans = 3276800 | 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后) |
net.ipv4.tcp_max_syn_backlog = 262144 | 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128 |
net.ipv4.tcp_timestamps = 0 | 时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉 |
net.ipv4.tcp_synack_retries = 1 | 为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量 |
net.ipv4.tcp_syn_retries = 1 | 在内核放弃建立连接之前发送SYN包的数量 |
net.ipv4.tcp_tw_recycle = 1 | 开启TCP连接中time_wait sockets的快速回收 |
net.ipv4.tcp_tw_reuse = 1 | 开启TCP连接复用功能,允许将time_wait sockets重新用于新的TCP连接(主要针对time_wait连接) |
net.ipv4.tcp_mem = 94500000 915000000 927000000 | 1st低于此值,TCP没有内存压力,2nd进入内存压力阶段,3rdTCP拒绝分配socket(单位:内存页) |
net.ipv4.tcp_fin_timeout = 15 | 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。 |
net.ipv4.tcp_keepalive_time = 30 | 表示当keepalive起用的时候,TCP发送keepalive消息的频度(单位:秒) |
net.ipv4.ip_local_port_range = | 2048 65000 对外连接端口范围 |
fs.file-max = 102400 | 表示文件句柄的最大数量 |
可以通过/etc/sysctl.conf控制和配置Linux内核及网络设置。
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
kernel.exec-shield = 1
kernel.randomize_va_space = 1
net.ipv6.conf.default.router_solicitations = 0
net.ipv6.conf.default.accept_ra_rtr_pref = 0
net.ipv6.conf.default.accept_ra_pinfo = 0
net.ipv6.conf.default.accept_ra_defrtr = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.default.dad_transmits = 0
net.ipv6.conf.default.max_addresses = 1
fs.file-max = 65535
kernel.pid_max = 65536
net.ipv4.ip_local_port_range = 2000 65000
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1