Linux系统运维相关命令实践(三)
进程管理
进程定位:运行中程序
标识:pid
网络标识:port
组成:程序代码、运行数据、PCB
进程【资源分配的最小单元,进程间资源彼此隔离】、线程【cpu任务调度的最小单元、共享进程的资源】
状态:创建、就绪、执行、终止、阻塞
特殊:僵尸【父进程停止】、孤儿【Screen】
查看:ps(默认只显示当前终端进程)、

pstree(以树状图的形式显示进程)

top(实时显示系统运行状况)、

free(看内存还剩多少,用了多少,空闲,swap)

vmstat(看系统整体忙不忙,CPU,内存,磁盘,交换分区)

lsof(查看那个进程在占用文件,端口)

管理:kill、killall、pkill
kill(杀掉进程)
killall(按进程名字杀进程批量)
pkill(模糊杀进程,批量)
任务:
jobs(查看后台有哪些任务)
bg(放后台跑)
fg(切回前台)
kill %id(杀掉当前终端的后台任务)
nohup(让程序后台运行)
Ctrl + Z(把当前前台暂停,丢到后台,不是关闭,暂停)
1 进程有哪些部分组成
程序代码、运行数据、PCB
2 常见查看进程相关的命令有哪些
ps、pstree、top、free、vmstat、lsof、pgrep(模糊找pid)、pidof(精确找pid要全名)、fuser(查看哪个进程在占用文件端口)等等
3 使用哪个命令可以将前台执行的命令扔到后台,而且命令终端关闭后,不影响后台命令的执行
nohup
进程管理常用命令实践
1.查看所有进程
---ps aux

2.过滤找某个进程
ps aux | grep ssh

ps aux | grep nginx

ps aux | grep java

3.实时监控系统进程
top
4.只看某个程序的 PID
pidof nginx
pidof sshd

5.. 查看端口被哪个进程占用(排错神器)
ss -tulnp

7.正常关闭进程(温柔 kill)
kill 1234

8. 强制杀死卡死进程
kill -9 1234

9. 按进程名直接杀
pkill nginx
pkill tail

10. 查看后台任务
jobs
11. 命令后台运行(不占终端)
sleep 60 &
12. 退出终端仍继续运行
nohup sleep 3600 &
任务管理
计划任务
一次性计划
atd(跑任务的服务)
at(创建任务的命令)
一次性定时执行任务,执行完即失效,依赖 atd 服务运行。
-
提交任务:
at 时间,交互模式输入命令,Ctrl+D保存退出 -
查看任务队列:
atq -
删除任务:
atrm 任务编号 -
查看服务状态:
systemctl status atd
用户提交任务 → 写入 /var/spool/at/ 队列 → atd 定时扫描 → 时间到自动执行 → 执行完成后任务文件自动删除
- 任务文件仅执行时临时存在,执行完自动清理,不会永久保留
- 任务输出默认发送给
root用户,建议手动写日志便于排查 - 任务未执行前
atq可看到,执行后会自动从队列消失
at实践
rocky交互式创建
1.添加任务 ctro+d 退出

2.列出任务

3.查看任务具体内容 -c指定任务编号


4.查看还没有执行的任务

5.查看上面输入的内容即文件

6.后期到了时间查看结果
ll /tmp/at-00-05
stat /tmp/at-1448
7.输出内容在邮件里面
mail 显示at success(文件已删除)
8.ls -l /var/spool/cron/atjobs/
9.查看日志
cat /var/spool/mail/root
查看日志记录
tail /var/log/maillo/
周期性计划
crond(周期性定时任务服务)、
contab(编辑查看,删除定期性任务)
用户级别(contab -e 存放在/ar/spool/cron/用户名)、
实践
1.查看cron任务

root用户可指定用户


普通用户只能查看自己名下 的crontab

修改默认编辑工具(可配置文件修改)

全局级别(主配置/etc/crontab和子配置/etc/cron.d/)
配置样例
格式:分 时 日 月 周
*:该位置上所有可以出现的值
* * * * * → 每分钟执行一次
1 2 * * * → 每天 2 时 1 分执行一次
,:该位置上多个值
1,3,5 2,4,6 * * * → 第 2、4、6 小时中,每个小时的第 1、3、5 分执行一次
-:范围取值
1-5 2-6 * * * → 第 2 到第 6 小时,第 1 到第 5 分每分钟执行一次
/:频率、步长
*/5 */6 * * * → 每 6 小时,在该小时内每 5 分钟执行一次
*/5 1,3,5-8 * * 2,4 → 每周二和周四的第 1、第 3、第 5 到第 8 时,每 5 分钟执行一次
1 2 1-10 * 1-5 → 每月的 1 到 10 日,或每周一到周五的 2 时 1 分执行一次
1-30/5 * * * * → 每小时 1-30 分内,每 5 分钟执行一次
@yearly / @annually → 每年 1 月 1 日执行一次,相当于 0 0 1 1 *
@monthly → 每月 1 日执行一次,相当于 0 0 1 * *
@weekly → 每周日执行一次,相当于 0 0 * * 0
@daily → 每天 0 时执行一次,相当于 0 0 * * *
@hourly → 每小时 0 分执行一次,相当于 0 * * * *
@reboot → 重启后执行一次
如果想添加系统级的cron,可写入一下文件

可以通过systemctl status crontab来检查
内核管理
功能启动
默认: /boot/config-xxx(查看当前内核编译,开启了哪些功能)
值:y(编译进内核,直接用)
m(编译成模块,需要时加载)
命令:
lsmod(查看当前已加载的内核模块)

insmod(手动加载内核模块 用法 insmod 模块名 .ko) ip a 查看效果


查看依赖模块 modinfo ipip

modprobe(自动加载模块,包括依赖,智能装可解决依赖)

rmmod(卸载已加载的内核模块,不能卸载有依赖的模块)

modinfo(查看内核模块详细信息)

参数调整
临时生效:echo 数值 > 文件( /proc/sys/ 下的文件)
sysctl -w (临时修改内核参数 重启失效)

永久生效:/etc/sysctl.conf(内核参数的永久配置文件)
/etc/sysctl.d/*.conf(内核参数永久配置文件)
sysctl -p(重新加载/ect/sysctl.conf里的内核参数)

查看参数:sysctl -a(查看所有内核参数)


网络管理
分层
OSI 七层模型:【应用层、表示层、会话层、传输层、网络层、链路层、物理层】 TCP/IP 四层模型:【应用层、传输层、网络层、网络链路层】
TCP 协议
三次握手
客户端 → 服务器:SYN
服务器 → 客户端:SYN + ACK
客户端 → 服务器:ACK
一问、一答、一确认 目的:保证双方收发都正常
四次挥手
客户端 → 服务器:FIN
服务器 → 客户端:ACK
服务器 → 客户端:FIN
客户端 → 服务器:ACK
两边各发一次关闭、各确认一次
因为要双向单独关闭,所以多一次
报文结构:
头部固定:20 字节,
包含源 port【2 字节】
目标 port【2 字节】
标志位【FIN(关闭连接 finish)、SYN(建立连接Synchronize)、ACK(确认 Acknowledgment)】
常见端口:
80:网页
22:ssh 远程登录
53 域名解析
3306 Mysql数据库
6379Redis缓存
IP 协议
报文结构:
头部固定: 20 字节,
包含源 ip【4 字节】
目标 ip【4 字节】
版本:ipv4【32 位】、ipv6【128 位】
ipv4 样式示例:
IP:10.0.0.12 子网掩码:255.255.255.0
CIDR:10.0.0.12/24
地址分类
A 类:10.0.0.0/8
B 类:172.16.0.0/16~172.31.0.0/16
C 类:192.168.0.0/24~192.168.255.0/24
D(组播)
E(保留 科研用)
综合实践:
1.编写一个Bash脚本,能够监控指定名称的进程(例如 nginx 或 sshd)。如果进程存在,则输出其PID和状态信息 如果进程不存在,则自动尝试重启该进程(可假设进程启动命令已知),并记录日志(包含时间戳) 脚本中至少包含一个函数、一个条件判断以及一个循环(如每5秒检查一次)解释脚本中使用的进程管理相关命令(如 ps aux、kill -0 检测进程存在性、& 后台运行、jobs/fg 等)的作用

#!/bin/bash
# ****************************************
# * 功能:Shell脚本模板
# * 作者:杨富程
# * 联系:yangfucheng@ssyang.com
# * 版本:2026-04-13
#编写一个Bash脚本,能够监控指定名称的进程(例如 nginx 或 sshd)。如果进程存在,则输出其PID和状态信息 如果进程不存在,则自动尝试重启该进程(可假设进程启动命令已知),并记录日志(包含时间戳) 脚本中至少包含一个函数、一个条件判断以及一个循环(如每5秒检查一次)解释脚本中使用的进程管理相关命令(如 ps aux、kill -0 检测进程存在性、& 后台 运行、jobs/fg 等)的作用
# 定义需要监控的目标进程名称
PROCESS_NAME="nginx"
# 定义进程不存在时执行的启动命令
START_CMD="/usr/sbin/nginx"
# 定义日志文件的保存路径
LOG_FILE="/var/log/process_monitor.log"
# ====================== 检查进程的函数======================
# 定义检查进程状态的函数
check_process() {
# 使用pgrep -x精确匹配进程名,输出重定向到空设备,不打印到终端
if pgrep -x "$PROCESS_NAME" > /dev/null
then
# 获取匹配到的进程PID,取第一个
pid=$(pgrep -x "$PROCESS_NAME"| head -n 1)
# 通过ps命令获取进程的用户、PID、CPU占用、启动命令,不显示表头
info="$(ps -p $pid -o user,pid,pcpu,cmd --no-headers)"
# 打印带时间戳的进程正常信息,同时追加写入日志文件
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 进程正常 PID:$pid 状态:$INFO" | tee -a "$LOG_FILE"
# 函数返回0,表示进程存在
return 0
else
# 打印带时间戳的进程不存在提示,同时追加写入日志文件
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 进程不存在" | tee -a "$LOG_FILE"
# 函数返回1,表示进程不存在
return 1
fi
}
# ====================== 主循环======================
# 开启无限循环,持续监控进程
while true
do
# 调用check_process函数,执行进程检查
check_process
# 获取上一条命令(函数)的退出状态码
# 判断状态码是否不等于0,即进程不存在
if [ $? -ne 0 ]
then
# 打印尝试重启进程的提示,同时写入日志
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 尝试重启进程..." | tee -a "$LOG_FILE"
# 执行进程启动命令,&符号表示后台运行
$START_CMD &
# 休眠1秒,等待进程启动完成
sleep 1
# 再次检查进程是否成功启动
if pgrep -x "$PROCESS_NAME" > /dev/null
then
# 打印重启成功信息,写入日志
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 重启成功" | tee -a "$LOG_FILE"
else
# 打印重启失败信息,写入日志
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 重启失败" | tee -a "$LOG_FILE"
fi
fi
# 休眠5秒,进行下一轮检查
sleep 5
done

如何将此脚本设置为开机自启动或通过 cron 定期执行?
第一种是开机自启动:先给脚本加执行权限,把脚本路径写到 /etc/rc.local 里 exit 0 前面,后面加个 & 让它后台运行,再给 rc.local 加权限就行。
1.赋予执行权限
chmod +x /root/process_monitor.sh
2.配置开机自启
vim /etc/rc.local
3.写脚本保存
#!/bin/bash
# 开机自动执行的脚本
/root/process_monitor.sh &
exit 0
4.验证脚本运行
chmod +x /etc/rc.local
ps aux | grep process_monitor.sh
测试nginx进程,先停止nginx
pkill nginx
![]()
6.等5秒脚本会自动检测重启
7.查看是否重启
ps aux | grep nginx

8.查看脚本日志
tail -f /var/log/process_monitor.log

第二种是cron定时执行,但 cron 最小单位是分钟,不适合咱们这个秒级循环的脚本。如果要用,就得先去掉脚本里的 while 循环,改成只检查一次,再用 crontab 设置每分钟跑一次。
1.去掉循环只检查一次
#!/bin/bash
LOG_FILE="/var/log/process_monitor.log"
PROCESS_NAME="nginx"
# 进程检查函数
check() {
local DATE_NOW=$(date "+%Y-%m-%d %H:%M:%S")
local PID=$(pgrep -P 1 "$PROCESS_NAME" | head -n 1)
if [ -n "$PID" ]; then
local INFO=$(ps -p "$PID" -o cmd --no-headers 2>/dev/null)
echo "[$DATE_NOW] 进程正常 PID:$PID 命令:$INFO" >> "$LOG_FILE"
else
echo "[$DATE_NOW] $PROCESS_NAME 进程不存在,正在重启..." >> "$LOG_FILE"
systemctl start $PROCESS_NAME
fi
}
# 执行一次检查(给 cron 使用)
check

2.配置crontab定时任务
crontab -e
1 回车

2.检查配置是否成功
crontab -l

3.测试,手动停掉nginx
systemctl stop nginx
等一分钟查看日志

2. 设计一个周期性任务:每周日凌晨3点自动清理 /tmp 目录下超过7天的临时文件每天中午12点记录当前系统进程数、内存使用量到 /var/log/system_health.log 使用 crontab 配置上述任务,并解释 cron 的时间语法、环境变量问题及日志查看方法 完成一个内核管理实践:通过 sysctl 临时和永久修改一个内核参数(例如 vm.swappiness=10 或 net.ipv4.tcp_syncookies=1) 使用 cat/proc/sys/net/ipv4/ip_forward 等方式查看当前值,并解释 /proc 文件系统的虚拟文件特性 在博客中展示 crontab -l 输出、系统日志(/var/log/cron 或 /var/log/syslog)相关条目,以及修改内核参数前后的对比效果(如 free 或 sysctl -a | grep swappiness)
#!/bin/bash
# *************************************************************
# * 功能:定时清理/tmp + 系统状态监控 + 内核参数管理
# * 作者:yangfucheng
# * 联系:yangfucheng@ssyang.com
# * 版本:2026-04-16
# *************************************************************
# 日志文件定义
SYSTEM_HEALTH_LOG="/var/log/system_health.log"
CLEAN_TMP_LOG="/var/log/clean_tmp.log"
# 功能1:清理/tmp目录下超过7天的文件
clean_tmp() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始清理 /tmp 下超过7天的文件" >> $CLEAN_TMP_LOG
find /tmp -type f -mtime +7 -delete
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清理完成" >> $CLEAN_TMP_LOG
}
# 功能2:记录系统进程数、内存使用情况
system_health() {
echo "================================================" >> $SYSTEM_HEALTH_LOG
echo "记录时间:$(date '+%Y-%m-%d %H:%M:%S')" >> $SYSTEM_HEALTH_LOG
echo -n "当前总进程数:" >> $SYSTEM_HEALTH_LOG
ps aux | wc -l | awk '{print $1-1}' >> $SYSTEM_HEALTH_LOG
echo "内存使用情况:" >> $SYSTEM_HEALTH_LOG
free -h >> $SYSTEM_HEALTH_LOG
echo "" >> $SYSTEM_HEALTH_LOG
}
# 功能3:内核参数修改(临时+永久)
kernel_config() {
echo -e "\n===== 修改前内核参数 ====="
sysctl vm.swappiness
cat /proc/sys/vm/swappiness
# 临时修改
sysctl -w vm.swappiness=10
# 永久写入配置
if ! grep -q "vm.swappiness=10" /etc/sysctl.conf; then
echo "vm.swappiness=10" >> /etc/sysctl.conf
fi
# 生效配置
sysctl -p
echo -e "\n===== 修改后内核参数 ====="
sysctl vm.swappiness
cat /proc/sys/net/ipv4/ip_forward
}
# 参数匹配执行
case "$1" in
clean)
clean_tmp
;;
health)
system_health
;;
kernel)
kernel_config
;;
*)
echo "使用方法:"
echo "$0 clean 清理/tmp文件"
echo "$0 health 记录系统状态"
echo "$0 kernel 修改内核参数"
;;
esac


运行结果
给脚本加执行权限
1. 测试清理功能
2. 测试系统监控(日志写入)
3. 测试内核参数修改

配置 crontab 定时任务

查看定时任务是否生效

查看日志(系统)

2. 清理日志

3. 内核参数查看

/proc 是什么?
-
虚拟文件系统
-
不占硬盘
-
实时查看内核状态
内核修改方法
临时:sysctl -w vm.swappiness=10
永久:写入 /etc/sysctl.conf
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)