进程检测与控制
一、Linux计划任务
计划任务是Linux系统中非常实用的功能,它允许用户在指定的时间自动执行特定的命令或脚本,无需人工干预。
==定时备份== ==服务重启== ==资源监控== ==故障服务==
(1)、计划任务权限
Linux系统中对计划任务的使用有权限控制,主要通过黑名单和白名单来实现。
(2) 黑名单
crontab是任何用户都可以创建的计划任务,但是超级管理员可以通过配置来设置某些用户不允许设置计划任务。
案例:把普通账号zkingtest加入到cron.deny黑名单中,禁止其创建计划任务
步骤:
-
切换到超级管理员root
su - root
2、使用vim打开/etc/cron.deny文件
vim /etc/cron.deny
3、把需要禁止的用户名单加入此文件(如zkingtest)
zkingtest
保存退出后,切换到zkingtest账号,测试是否可以使用crontab命令:
su - zkingtestcrontab -e
系统会显示错误信息,表示该用户无权使用crontab命令。
(3)白名单
在Linux的计划任务中,除了黑名单以外,还有白名单。作用:允许哪些用户使用计划任务。
白名单文件的路径=>/etc/cron.allow
,但是要特别注意,此文件需要手工创建。
注意:白名单优先级高于黑名单,如果一个用户同时存在两个名单文件中,则会被默认允许创建计划任务。
案例:创建白名单,只允许user1和user2使用计划任务
vim /etc/cron.allow
添加以下内容:
user1
user2
白名单中 xmg
只要设置了白名单,除了白名单中的人其他人丢无法使用crontab
(4)查看计划任务的保存文件
问题:计划任务文件具体保存在哪里呢?
答:/var/spool/cron/用户名称
,如果使用root用户编辑计划任务,则用户文件名为root
ll /var/spool/cron
total 4
-rw------- 1 zkingtest zkingtest 0 Mar 24 09:50 zkingtest
-rw------- 1 root root 40 Mar 24 10:21 root
查看具体内容:
cat /var/spool/cron/root
这个文件包含了用户设置的所有计划任务,每行一个任务。
(5)、计划任务的日志程序
问题:在实际应用中,我们如何查看定时任务运行情况?
答:通过计划任务日志,日志文件位于/var/log/cron
案例:演示计划任务的日志程序
第一步:使用root账号创建一个计划任务
su - root
crontab -e
* * * * * echo 1 >> ~/readme.txt
此计划任务将每分钟向root用户主目录下的readme.txt文件追加数字1。
第二步:使用tail -f命令监控/var/log/cron日志程序
tail -f /var/log/cron
你会看到类似以下的日志条目:
Mar 24 10:21:01 localhost crond[12345]: (root) CMD (echo 1 >> ~/readme.txt)
这表示计划任务正在执行。要验证结果,可以查看readme.txt文件:
cat ~/readme.txt
文件内容应该包含多个"1",表示任务已多次执行。
(6)、扩展内容:at命令
在Linux系统下,有两个命令可以实现计划任务:crontab与at(第三方需要额外安装)
-
crontab:每天定时执行计划任务,适合周期性任务
-
at:一次性定时执行任务,执行完后不再重复
(7)安装at命令
CentOS7自带,其他版本可能需要手工安装
yum install at -y
(8)启动底层服务
systemctl start atd
systemctl enable atd
atd = at + d = at命令 + daemon(守护进程)缩写
(9)案例演示
案例1:三天后下午5点执行/bin/ls
at 5pm + 3days
at>/bin/ls
at>按Ctrl+D
am=上午、pm=下午、3days=3天
(10)执行过程详解:
-
输入
at 5pm + 3days
设置执行时间 -
在提示符
at>
后输入要执行的命令/bin/ls
-
按Ctrl+D结束输入
-
系统会显示job编号和执行时间的确认信息
案例2:明天17点,输出时间到指定的文件中
at 17:00 tomorrow
at>date > /root/readme.txt
at>按Ctrl+D
tomorrow=明天
执行结果验证:当明天17:00到达时,系统会自动执行命令,将当前日期写入/root/readme.txt文件。
案例3:使用atq查看没有执行的计划任务
atq
atq = at + q = at命令 + query(查询)
命令输出示例:
2 Fri Mar 25 17:00:00 2022 a root
3 Sun Mar 27 17:00:00 2022 a root
显示任务编号、执行时间和用户。
案例4:删除指定的计划任务
atq
atrm 任务号
atrm = at + rm = at命令 + remove(移除)
例如删除任务编号为2的计划任务:
atrm 2
再次使用atq
查看,任务2应该已经被删除。
二、Linux进程与程序
1、了解一下进程与程序的关系
进程是正在执行的一个程序或命令,每个进程都是一个运行的实体,并占用一定的系统资源。程序是人使用计算机语言编写的可以实现特定目标或解决特定问题的代码集合。
简单来说,程序是人使用计算机语言编写的,可以实现一定功能,并且可以执行的代码集合。进程是正在执行中的程序。
举例:
-
谷歌浏览器是一个程序,当我们打开谷歌浏览器时,系统中会生成一个浏览器的进程。此时,程序的代码被加载到内存中,操作系统为这个进程分配一个ID,称为PID(进程ID)。
谷歌浏览器 pid = 1000
打开多个对应的窗口
A pid = 1001 ppid = 1000
B pid = 1002 ppid = 1000
C pid = 1003 ppid = 1000
-
如果我们打开多个谷歌浏览器窗口,系统会为每个窗口生成一个子进程,每个子进程都有自己的PID,但它们的PPID(父进程ID)都是相同的,即它们的父进程是启动它们的主浏览器进程。
通俗的例子:
-
家庭:想象一个家庭,父母是父进程,孩子是子进程。父母(父进程)负责照顾和管理孩子(子进程),每个孩子都有自己的名字(PID),但他们的父母的名字(PPID)是相同的。
-
公司:在公司中,经理是父进程,员工是子进程。每个员工都有自己的员工编号(PID),但他们的经理(PPID)是相同的。经理负责指导和管理所有员工的工作。
PID与PPID的关系:
-
PID(Process ID)是操作系统分配给每个进程的唯一标识符。
-
PPID(Parent Process ID)是创建该进程的父进程的PID。每个进程都有一个父进程,除非它是系统启动时创建的第一个进程(通常是init进程)。
示例:
-
当你在终端中运行一个命令(如
top
),系统会为这个命令创建一个进程,分配一个PID,比如1234。这个进程的PPID是你打开终端的进程ID,比如5678。 -
如果在
top
命令中你又打开了一个新的命令(如htop
),那么htop
的PID可能是1235,而它的PPID仍然是1234(即top
的PID)。
通过这些例子,学生可以更直观地理解PID和PPID的概念,以及它们在进程管理中的重要性。
2、Linux下的进程管理工作
Linux系统管理员需要进行以下进程管理工作:
-
进程查看:通过查看,判断系统健康状态
-
进程终止:终止异常或不需要的进程
-
进程优先级控制:调整进程的优先级以优化系统性能
3、使用top命令动态监测CPU信息
top
命令是Linux中用于实时监控系统进程和资源使用情况的工具。它提供了关于CPU、内存和进程的详细信息。
基本语法:
top
输出内容解释:
1.任务信息:
-
Tasks: 显示当前系统中的进程总数、运行中的进程、睡眠中的进程、停止的进程和僵尸进程的数量。
`Tasks: 219 total, 1 running, 218 sleeping, 0 stopped, 0 zombie`
表示当前有219个进程,其中1个正在运行,218个处于睡眠状态。
2.CPU使用情况:
-
%Cpu(s): 显示CPU的使用情况,包括用户空间、系统空间、空闲时间等。
`%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 100.0 id`表示CPU
当前没有在执行用户进程或系统进程,100%处于空闲状态。
3.内存使用情况:
-
KiB Mem: 显示系统的总内存、已用内存、空闲内存和缓存内存。
`KiB Mem : 3861260 total, 2659804 free, 599468 used, 601988 buff/cache`
表示总内存为3861260KiB,其中2659804KiB是空闲的。
4. 进程信息:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00kworker/0:0H
-
PID: 进程ID
-
USER: 进程所属用户
-
PR: 进程的优先级
-
NI: 进程的nice值,影响进程的优先级
-
VIRT: 进程使用的虚拟内存总量
-
RES: 进程使用的物理内存总量
-
SHR: 进程使用的共享内存量
-
S: 进程状态(R=运行,S=睡眠,Z=僵尸等)
-
%CPU: 该进程使用的CPU百分比
-
%MEM: 该进程使用的内存百分比
-
TIME+: 进程使用的CPU时间
-
COMMAND: 进程的命令名称
在top命令运行时,用户可以输入特定的按键来执行不同的操作,例如:
P:按CPU使用率排序。
M:按内存使用率排序。
T:按CPU时间累计排序。
k:发送信号给进程,通常用于终止进程。
r:重新设置进程的nice值,即优先级。
案例:使用top命令查看系统进程
top
在top界面中,按q
键可以退出。
4、使用ps命令查看进程
ps
命令用于查看当前系统中的进程信息。
基本语法:
ps [选项]
常用选项:
-
-e
:列出所有进程 -
-f
:显示完整格式的信息
案例:显示当前系统中所有进程的信息
ps -ef
输出内容解释:
-
USER: 进程所属用户
-
PID: 进程ID
-
PPID: 父进程ID
-
%CPU: CPU使用率
-
%MEM: 内存使用率
-
COMMAND: 进程的命令名称
5、使用kill命令终止进程
基本语法:
kill [信号] PID
案例:使用kill命令杀死crond进程
# ps -ef | grep crond
# kill 7102
信号种类:
-
-9
(SIGKILL):强制终止进程 -
-15
(SIGTERM):正常终止进程
信号区别:
-
SIGKILL (-9): 强制终止进程,进程无法捕获此信号,立即被操作系统终止。适用于无法正常结束的进程。
-
SIGTERM (-15): 请求进程正常终止,进程可以捕获此信号并进行清理工作。适用于希望优雅地关闭进程的场景。
6、使用killall命令根据进程名称杀死进程
基本语法:
killall [信号] 进程名称
案例:使用killall命令杀死httpd进程
killall httpd
7、netstat查询网络访问信息
netstat 是一个非常有用的工具,用于显示网络连接、路由表、接口统计信息等。
netstat -na 命令可以显示所有连接和监听端口,并以数字形式显示地址和端口号。
Proto: 协议类型(TCP 或 UDP)。
Recv-Q: 接收队列的字节数。
Send-Q: 发送队列的字节数。
Local Address: 本地地址和端口号。
Foreign Address: 远程地址和端口号。
State: 连接状态(例如 LISTENING、ESTABLISHED 等)。
常见状态
LISTENING: 侦听来自远方的 TCP 端口的连接请求。
ESTABLISHED: 已建立连接,表示一个打开的连接。
TIME_WAIT: 等待足够的时间以确保远程 TCP 接收到连接中断请求的确认。
netstat -anp:显示系统端口使用情况
netstat -nupl:UDP类型的端口
netstat -ntpl:TCP类型的端口
netstat -na|grep ESTABLISHED|wc -l:统计已连接上的,状态为"established"
netstat -l:只显示所有监听端口
netstat -lt:只显示所有监听tcp端口
基本语法:
-t:TCP
-u:UDP
-n:数字地址
-l:监听的端口
-p:PID和进程名称
netstat -tnlp | grep 进程名称
案例:查询WebServer(httpd)服务的端口信息
netstat -tnlp | grep httpd
三、实际应用案例
(1)系统响应缓慢,需要诊断性能问题
场景描述:
公司的Web服务器突然变得非常缓慢,用户反映网页加载时间过长。作为系统管理员,你需要快速诊断并解决问题。
解决步骤:
-
首先,使用
top
命令查看系统资源使用情况:top
-
在top输出中,你发现一个名为
httpd
的进程占用了90%的CPU,PID为1234:PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1234 apache 20 0 1254108 356540 12104 R 90.0 9.2 45:23.45 httpd
-
使用
ps
命令获取更多关于这个进程的信息:ps -ef | grep 1234
-
你发现这是一个可能陷入死循环的脚本导致的问题,需要终止该进程:
kill 1234
-
等待几秒钟,再次检查进程是否还在运行:
ps -ef | grep 1234
-
如果进程仍在运行,使用强制终止命令:
kill -9 1234
-
最后,检查系统性能是否恢复:
top
(2)服务器被恶意程序占用,需要识别并删除
场景描述:
系统管理员注意到服务器的CPU使用率异常高,怀疑服务器可能被恶意软件入侵。
解决步骤:
-
使用
top
命令查看实时进程情况:top
-
发现有多个可疑的进程名称(例如:
miner
)占用大量CPU资源。 -
使用
ps
命令列出所有这些进程:ps -ef | grep miner
-
检查这些进程的启动时间和父进程:
ps -eo pid,ppid,cmd,lstart | grep miner
-
终止所有相关进程:
killall -9 miner
-
查找并删除恶意程序文件:
find / -name "*miner*" -type f 2>/dev/null
(3)监控特定服务的网络连接
场景描述: 安全团队需要监控Web服务器的所有当前连接,以便分析潜在的DDoS攻击。
解决步骤:
-
使用
netstat
命令检查Web服务器(通常在80或443端口)的所有连接:netstat -antp | grep ":80\|:443"
-
查看有多少独立IP正在连接Web服务器:
netstat -antp | grep ":80\|:443" | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
-
如果发现某个IP地址有异常多的连接数,可以使用防火墙临时阻止该IP:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="可疑IP" reject' --timeout=3600
(4)案例五:紧急维护需求,临时安排任务
场景描述: 运维工程师需要在夜间进行系统更新,但自己无法熬夜操作。需要设置一个在特定时间执行的一次性任务。
解决步骤:
-
创建更新脚本
system_update.sh
:vim /root/system_update.sh
写入以下内容:
#!/bin/bash # 记录完成时间 echo "更新完成: $(date)" >> /root/update_log.txt
-
赋予脚本执行权限:
chmod +x /root/system_update.sh
-
使用
at
命令安排在今晚23:30执行:at 23:30 at> /root/system_update.sh at> <Ctrl+D>
-
确认任务已被安排:
atq
-
如果需要取消任务:
atrm <任务号>