Linux系统进程管理、信号、服务
知识点
平均负载(Load Average):
-
描述系统的负载情况,是一个重要的性能指标。
使用
top
命令查看系统的平均负载。
Kill命令:
-
用于终止进程,可以通过发送不同的信号来控制进程的终止方式。
-
使用
kill -0
来检查进程是否存在,而不发送任何信号。kill 1234 # 终止进程ID为1234的进程 kill -0 1234 # 检查PID为1234的进程是否存在 pkill nginx # 通过进程名杀死进程 kill -HUP $(cat /var/run/nginx.pid) # 平滑重启Nginx服务
信号(Signal):
-
用于进程间通信,可以指定不同的信号来执行不同的操作。
-
常用信号包括:
HUP
(挂起信号):重新配置或重新加载进程。INT
(中断信号):结束进程,与Ctrl+C相同。QUIT
:让进程退出。KILL
(信号9):强制杀死进程,慎用。TERM
:默认终止信号。- SIGHUP`(信号1)用于平滑重启服务,通常用于重新加载配置。
服务管理:
- 如何启动、停止、重启服务,以及平滑重启的概念。
systemctl restart nginx # 平滑重启nginx服务
nginx -s reload # 使用Nginx的配置文件中的指令来平滑重启,不影响正在处理的连接
软链接(Soft Link):
- 用于链接不同版本的软件,方便管理和升级。
ln -s /path/to/nginx1.20.1 /usr/local/nginx # 创建指向nginx1.20.1的软链接
ln -sf /path/to/new/nginx /usr/local/nginx # 更新软链接指向新的Nginx版本
端口和服务:
- 如何查看特定端口的服务状态。
lsof -i :80 # 查看端口80的服务
netstat -tulnp | grep 80 # 查看端口80的服务和进程信息
进程前后台切换的重要性
- 允许用户在执行长时间运行的命令时,不必保持终端连接活跃。
- 适合于远程拷贝大文件或执行长时间操作,防止因网络中断或终端关闭而丢失数据。
-
相关命令:
Ctrl + Z
:暂停当前进程并将其放到后台。bg
:将暂停的进程放到后台继续运行。fg
:将后台进程拿到前台运行。jobs
:查看当前后台运行的进程队列。kill %jobnumber
:杀死指定的后台进程,其中%jobnumber
是jobs命令显示的进程编号。sleep
:一个命令,用于暂停执行指定的秒数。
-
进程状态:
- 一个进程可以是运行的(Running)、暂停的(Stopped)或已退出(Exited)。
-
使用场景:
- 远程操作,如数据库维护或文件传输。
- 定时任务或需要持续运行的服务(守护进程)。
-
远程拷贝大文件:
假设你正在使用SSH连接到远程服务器,并需要拷贝一个大文件。如果直接拷贝,终端必须保持活跃状态。使用Ctrl + Z
将拷贝进程放到后台,然后你可以断开连接而不影响拷贝进程。scp /local/path/file.txt user@remotehost:/remote/path Ctrl + Z # 暂停并放到后台 bg # 继续在后台拷贝
-
执行长时间运行的命令:
如果你需要在服务器上运行一个可能需要10分钟的脚本,你可以将其放到后台,这样即使关闭了终端,脚本也会继续运行。./long_script.sh Ctrl + Z # 暂停并放到后台 bg # 放到后台继续执行
-
管理后台进程:
使用jobs
命令可以查看当前后台运行的进程,使用fg
可以将它们调回前台,使用kill %jobnumber
可以终止它们。jobs # 查看后台进程 fg %1 # 将编号为1的后台进程调回前台 kill %1 # 杀死编号为1的后台进程
nohup和
&的使用
使用&
符号将命令放入后台**
- 通过在命令后面添加
&
符号,可以直接将命令放入后台运行。
应用举例:执行一个脚本myscript.sh
并希望它在后台运行,可以使用./myscript.sh &
。
使用nohup
命令
nohup
命令允许程序在用户退出终端后继续运行,并且其输出信息不会显示在终端上。
应用举例:如果你需要下载一个大文件,并且不希望在终端关闭后下载中断,可以使用nohup wget http://example.com/file &
,这样即使关闭了终端,下载也会继续。
进程输出的重定向
- 使用
nohup
时,如果不指定输出文件,其输出默认会被重定向到用户的home目录下的nohup.out
文件中。
应用举例:如果你使用nohup
命令运行一个长时间运行的脚本,并且想要查看其输出,可以查看~/nohup.out
文件。
结合使用nohup
和&
- 可以将
nohup
和&
结合起来使用,以实现命令的后台运行和输出的重定向。
应用举例:如果你想要运行一个脚本,并且不管终端状态如何,都希望它持续运行,同时将输出重定向到特定的文件,可以使用nohup ./myscript.sh > output.log 2>&1 &
。这里2>&1
表示将标准错误重定向到标准输出。
screen命令
screen
命令:screen
是一个用于在多个会话中多任务操作的命令行工具,允许用户在一个终端窗口中启动多个会话,并在它们之间自由切换。- 后台运行:
screen
可以用来在后台运行程序,即使关闭了终端或者SSH连接,程序也会继续运行。 - 会话管理:
screen
允许用户创建多个独立的会话,可以在这些会话之间切换,执行不同的任务。 - 安装
screen
:如果系统中没有安装screen
,可以通过包管理器(如yum
、apt
等)进行安装。 - 使用场景:
screen
特别适用于管理员在服务器上进行长时间任务操作时不希望因为断开连接而丢失工作的场景。 - 命令操作:
screen -S sessionname
:创建一个新的会话。screen -ls
:列出当前所有的screen
会话。screen -r sessionname
:重新连接到一个已存在的会话。Ctrl+D
:在screen
会话中退出当前窗口。
- 后台与前台的区别:文档中提到,如果程序已经在服务器的后台运行,就不需要使用
screen
。screen
主要用于在远程连接时保持会话的持续性。
假设你是一名系统管理员,需要在服务器上运行一个长时间计算的任务,但你不希望如果SSH连接断开或者关闭终端窗口时任务被中断。
-
启动一个新的
screen
会话:screen -S long_running_task
-
在会话中启动任务:
python long_computation.py
-
将当前会话放到后台并释放终端:
Ctrl+D
-
断开SSH连接或关闭终端窗口:任务会继续在服务器上运行。
-
稍后重新连接到会话:
screen -r long_running_task
-
查看所有
screen
会话:screen -ls
-
结束一个会话:
- 首先连接到会话。
- 在会话中结束任务,例如通过关闭程序或者发送终止信号。
- 使用
exit
命令退出screen
会话。
通过这种方式,screen
提供了一种保持长时间运行任务连续性的方法,即使在远程连接不稳定或者需要关闭终端的情况下。
nice命令和renice命令
进程优先级:操作系统中,进程执行是排队进行的,有些进程比较重要,需要优先执行。
调整进程优先级:可以通过调整进程的nice值来改变其优先级。
nice命令:用于修改未运行程序的优先级。
nice
是一个在类 Unix 操作系统中用于改变程序运行优先级的命令。它允许用户调整程序的“niceness”值,从而影响其在系统调度中的优先级。一个程序的 nice 值越低,它在 CPU 时间分配上的优先级就越高,反之亦然。
以下是 nice
命令的一些基本用法:
- 改变命令的 nice 值:
nice -n [nice_value] [command]
nice_value
是一个数字,范围通常是从 -20 到 19。负值表示高优先级,正值表示低优先级。[command]
是你希望以改变后的优先级运行的命令。
- 查看当前进程的 nice 值:可以使用
ps
命令结合nice
,例如ps -o nice,pid,cmd -p [pid]
,其中[pid]
是你想要查看的进程的进程ID。 - 增加或减少 nice 值:如果不指定具体数值,
nice
命令默认将 nice 值增加 10,从而降低程序的优先级。
例如,如果你想要运行一个命令并将其 nice 值设置为 5,你可以这样做:
nice -n 5 [command]
请注意,只有具有适当权限的用户(通常是 root 用户)才能设置负的 nice 值,以提高程序的优先级。普通用户通常只能增加 nice 值,从而降低他们运行的程序的优先级。
在使用 nice
命令时,应该谨慎行事,因为不当的优先级调整可能会导致系统资源分配不当,影响系统的整体性能。
renice命令:用于修改正在运行的进程的优先级。
renice
是一个在类 Unix 操作系统中用于改变正在运行的进程的 nice 值(即优先级)的命令。与 nice
命令不同,renice
不是用来启动新程序的,而是用来调整已经启动的进程的优先级。
以下是 renice
命令的一些基本用法:
-
改变单个进程的 nice 值:
renice -n [nice_value] -p [pid]
nice_value
是你想要设置的新 nice 值。pid
是你想要改变优先级的进程的进程ID。
-
改变用户所有进程的 nice 值:
renice -n [nice_value] -u [username]
nice_value
是你想要设置的新 nice 值。username
是你想要改变该用户所有进程优先级的用户名。
-
改变所有进程的 nice 值:
renice -n [nice_value] -a
nice_value
是你想要设置的新 nice 值。- 使用
-a
选项会改变所有进程的 nice 值。
-
只改变高于或等于特定 nice 值的进程:
renice -n [nice_value] -p [pid] --pid-from [from_nice_value]
from_nice_value
是当前 nice 值的下限,只有当前 nice 值在这个值或更高的进程会被调整。
请注意,为了改变一个进程的 nice 值,你需要有足够的权限。通常,只有 root 用户或者具有适当权限的用户才能降低进程的 nice 值(即提高其优先级)。任何用户都可以增加一个进程的 nice 值(即降低其优先级),这将使该进程获得更少的 CPU 时间。
在使用 renice
命令时,应该谨慎行事,因为不当的优先级调整可能会影响系统资源的分配,从而影响系统的整体性能。
系统调用跟踪、进程监控、资源优化
- 知识点:系统调用是操作系统为应用程序提供的接口,用于执行如文件操作、网络通信等任务。跟踪系统调用有助于排查程序运行异常的原因。
- 实际应用:当一个Java进程CPU占用率异常高时,可以使用
strace
命令跟踪进程的系统调用,找出是哪个调用导致了问题。
2. 进程生命周期监控
- 知识点:监控进程的整个生命周期,包括从创建到消亡的过程,可以更好地理解进程行为,优化资源使用。
- 实际应用:使用
strace -f -p PID
可以跟踪一个进程及其所有子进程的系统调用,有助于分析进程的资源消耗模式。
3. 参数优化
- 知识点:通过调整系统参数,如CPU调度、内存分配等,可以优化系统性能。
- 实际应用:在服务器负载高时,通过调整内核参数和系统配置,如增加TCP缓冲区大小,可以提高网络传输效率。
- 知识点:明确开发和运维的责任界限,确保代码质量和系统稳定性。
- 实际应用:开发团队负责编写高质量的代码并及时修复bug,而运维团队负责监控系统运行状态和资源使用情况。
5. 资源预警与扩展
- 知识点:通过监控系统资源使用情况,提前预警并扩展资源以应对增长的负载。
- 实际应用:当服务器CPU使用率达到70%时,运维团队应预警并准备扩展资源,如增加服务器或升级硬件。
6. 流量管理
- 知识点:管理流量,特别是预计外的大流量,是确保网站稳定性的关键。
- 实际应用:在大型促销活动如“618”之前,运维团队应与市场部门沟通,预计流量增长,并提前准备CDN和服务器资源。
7. 离线查询与缓存
- 知识点:对于非实时性的查询,应使用离线处理或缓存机制,以减轻生产环境的负载。
- 实际应用:对于需要长时间运行的数据库查询,如生成月度报告,应安排在夜间或低峰时段进行,并使用缓存技术减少数据库负载。
8. 监控与趋势分析
- 知识点:使用监控工具来跟踪系统和应用的性能,分析趋势以预测未来的资源需求。
- 实际应用:通过监控工具如Prometheus,可以实时跟踪服务器的CPU、内存使用情况,并根据趋势数据预测未来的资源需求。
9. 技术与思维框架
- 知识点:技术是实现目标的手段,而正确的思维框架和沟通能力是提升个人价值和薪资的关键。
- 实际应用:运维工程师不仅需要掌握技术,还应具备良好的沟通能力和问题解决思维,这样才能在团队中发挥更大的作用,并提升个人职业发展。
通过这些知识点和实际应用的举例,我们可以看到,技术知识、流程管理和沟通协调是确保网站稳定运行和提升个人职业发展的重要因素。