Skip to content

Linux 进程·作业·服务·定时与电源

查看系统进程信息

  1. 常见命令
shell
ps -ef          # 查看系统中所有进程的信息
ps aux          # 查看系统中所有进程的详细信息
  1. 各列代表的含义
shell
USER               # 进程属于哪个用户
PID                # 进程ID号,每个进程的唯一标识符(非负整数),由内核分配。
%CPU               # 进程占用cpu资源的百分比,越高越耗费资源
%MEM               # 进程占用物理内存的百分比,越高越耗费资源
VSZ                # 进程占用虚拟内存的大小,单位KB
RSS                # 进程占用实际物理内存的大小,单位KB
TTY                # 进程是由哪个终端运行的,tty1 - tty7
STAT               # 进程的状态,S 进程在睡眠状态可被唤醒
START              # 进程耗费CPU运算的时间
TIME               # 进程已经占用的CPU时间
COMMAND            # 进程名称(用此判断哪个进程正在运行)
  1. 其他常用命令
shell
ps aux --sort -rss         # 查看进程占用物理内存排行,按 %MEM 列降序排列

实时查看系统中有哪些进程正在运行

  1. 命令行输入
shell
top
  1. 各行代表的含义
shell
第一行:系统当前时间,系统运行时间,系统在之前1分钟、5分钟、15分钟的平均负载
第二行:当前的进程总数,正在运行的进程数,睡眠的进程数、停止的进程数
第三行:被用户占用的CPU-us,被系统占用的CPU-sy,被修改优先级的占用的CPU-ni、空闲的CPU-id
第四行:总内存数,被占用内存,空闲内存,缓冲内存
第五行:交换分区
  1. 判断服务器健康状态
shell
一般来讲内存低于 70%,cpu 低于 90% 的状态是系统的安全状态,过高都属于亚健康状态
  1. 其他常用命令
shell
top -b -n 1 > /root/top.log         # 将现在的所有进程状态写入日志文件

查看进程之间的依赖关系

shell
pstree
pstree -p              # 显示进程树
pstree -u              # 显示进程的所属用户

进程管理

  1. kill 命令:关闭和重启进程
shell
# kill [num] PID
kill [1] PID                     # 重启进程(通过PID)
kill [9] PID                     # 关闭进程(通过PID)

# 示例
ps aux                           # 查看PID
kill 1 52212                     # 重启PID为52212的进程
kill 9 52212                     # 关闭PID为52212的进程
  1. killall 命令:批量操作
shell
# killall [num] 包名
killall -9 包名                  # 关闭包下的所有进程

# 示例
killall -9 httpd                 # 关闭httpd下的所有进程
  1. pkill 命令:杀死某一类进程,通常是管理员操作将某个或者其他用户踢出服务器终端
shell
pkill -9 -u user1            # 杀掉 user1 用户下的所有进程
pkill -9 -t pts/1            # 杀掉 pts/1 终端下的所有进程
pkill -9 -v -u root          # 杀死除了root用户的所有进程

:::tip有些命令需要持续运行,运行期间,管理员无法操作命令行,所以需要把此命令放入后台运行,不影响命令行操作 :::

前后台作业切换的三种状态

前台:直接与终端交互的进程,会占用终端输入输出(比如:pm2 start app.js --name "my-app")

后台:在后台运行,不占用终端,终端可继续接收其他命令(通常通过在命令后加 & 启动,如 python script.py &)。

暂停:被暂停(挂起)的进程,可通过命令恢复到前台或后台运行(如按 Ctrl+Z 暂停前台进程)。

前后台作业:查看、转后台、转回前台、终止

  1. 查看命令
shell
# 基础语法
jobs [选项] # 列出当前 shell 的所有前后台作业

# 选项
-l # 显示作业的进程 ID、PID、状态、命令,便于结合 kill 等命令(最常用)
-p # 仅显示作业的 PID(不显示其他信息)
-n # 仅显示自上次检查后状态发生变化的作业。
-r # 仅显示正在运行的作业
-s # 仅显示已暂停的作业。

# 结果
编号  PID     状态                      命令
[1]  468077 Stopped (tty output)    vim hello.txt


# 常见状态
Running:正在后台运行。
Stopped:被暂停(通常由 Ctrl + Z 触发)。
Done:已完成(退出码为 0)。
Exit:已退出(退出码非 0)。
  1. 将作业放入后台
shell
# 场景一:执行任意命令时放入后台
运行任意命令时 直接加 &  # 比如:vim hello.txt &

# 场景二:将前台运行的命令暂停并放入后台
:先按 Ctrl + Z
  1. 将后台作业调至前台
shell
# 查看作业列表的编号
jobs -l 

# 基础语法
fg %编号  # 比如:将编号 2 的作业调至前台,执行 fg %2,如果只执行 fg 则操作最近的作业
  1. 终止后台作业
shell
# 查看作业列表的编号|PID
jobs -l 

# 通过编号杀死作业
kill %编号  # 比如:将编号 2 的作业杀死,执行 kill %2
jobs # 第一次查看,编号 2 的状态变为 Terminated
jobs # 第二次查看,编号 2 整行消失

# 有时 kill %编号 无法杀死作业,则需要使用
kill -9 PID  # 比如:将PID为 468077 的作业杀死,执行 kill -9 468077
jobs -l  # 第一次查看,PID 为 468077 的状态变为 Killed
jobs -l  # 第二次查看,PID 为 468077 整行消失

注意事项

  • jobs 仅显示当前 shell 环境中的作业,切换到其他 shell(如重新登录或打开新终端)后无法查看。
  • 若作业已完成(状态为 Done 或 Exit),jobs 可能仍会显示,直到 shell 刷新状态(可通过再次执行 jobs 或操作其他作业触发)。

在 linux 中使用 at 设置只执行一次的定时任务,使用 cron 设置周期性执行任务 :::

at 定时任务(只执行一次的定时任务)

在 Linux 系统中,at 命令用于安排一次性的定时任务(与 cron 用于周期性任务不同),适合执行只需要运行一次的操作。

  1. 常见操作:安装、启动、关闭、查看、设置定时任务
shell
# 安装
yum install at

# 启动
systemctl start atd

# 重启
systemctl restart atd

# 关闭
systemctl enable atd

# 查看 at 定时任务服务是否开启
systemctl status atd  # 或者 ps aux | grep atd

# 基础语法
at [选项] 时间 

# 选项:查看、删除、文件、邮件
-l             # 列出当前用户的所有 at 任务(等同于 atq 命令)
-c <任务编>    # 根据工作号查看定时执行的是什么操作
-d <任务编>     # 删除指定任务(等同于 atrm 命令),比如:at -d 1
-f <脚本文>      # 从文件读取任务命令,而非交互输入,比如:at 15:00 -f /path/to/script.sh,15:00执行脚本
-m                # 任务执行完成后,通过邮件通知用户(需系统邮件服务支持)

# 时间
at 14:30 # 今天 14:30 执行
at midnight at 00:00 # 今天午夜
at noon # 今天中午

at 14:30 2025-10-30 # 2025 年 10 月 30 日 14:30 执行
at 14:30 tomorrow # 明天 14:30
at next monday 10:00 # 下周一 10:00 点

at now # 立即执行
# at 最小是分钟,不支持 秒,非要秒,可借助 sleep 命令
at now + 5 minutes # 5 分钟后
at now + 1 hour # 1 小时后
at now + 3 days # 3 天后
at now + 2 weeks # 2 周后

# 设置定时任务
方式一(定时执行多条命令):at 时间  # 输入命令回车后会进入 at 的交互模式,输入 要执行的linux命令,不断回车可执行多条命令,最后,按 Ctrl+D 结束并提交任务。
方式二(定时只执行一条命令):echo '要执行的linux命令' | at 时间 

# 方式一:1 分钟后将执行 echo "Hello world" > /tmp/at_test.txt
echo 'echo "Hello world" > /tmp/at_test.txt' | at now + 1 minutes

# 方式二:1 分钟后将 "one" "two" "three" 字符先后写入到 /tmp/at_test.txt 文件中
at now + 1 minutes
回车
> echo "one" > /tmp/at_test.txt
回车
> echo "two" >> /tmp/at_test.txt
回车
> echo "three" >> /tmp/at_test.txt
执行 ctrl + D
  1. at 权限控制(白名单和黑名单,控制哪些用户可使用此命令)
shell
ls /etc/at*          # 查看黑白名单配置文件
vim /etc/at.deny     # 黑名单,禁止使用 at 的用户列表(默认存在,为空则允许所有用户)
vim /etc/at.allow    # 白名单,允许使用 at 的用户列表(优先级高于 at.deny)
  1. 常见案例
shell
# 5 分钟后重启 Apache 服务
echo "systemctl restart httpd" | at now + 5 minutes

# 2 小时后清理 /tmp 目录下 7 天前的文件
echo "find /tmp -type f -mtime +7 -delete" | at now + 2 hours

# 2025 年 12 月 31 日 23:59 执行日志归档
echo "tar -czf /logs/archive_$(date +%Y%m%d).tar.gz /var/log/*" | at 23:59 12/31/2025

# 下周三 10:00 发送提醒邮件
echo 'echo "周三会议提醒" | mail -s "会议通知" user@example.com' | at 10:00 wednesday

# 今晚 12 点重启数据库
echo "shutdown -r now" | at 00:00

cron 定时任务(循环执行定时任务)

cron 通过守护进程 crond 运行,默认开机自启,负责周期性检查并执行 /etc/crontab 文件、/etc/cron.d/ 目录下的脚本, 以及用户的定时任务(存储在 /var/spool/cron/ 目录,文件名与用户名一致)

  1. 常见操作:安装、启动、关闭、查看、设置定时任务
shell
# 安装
yum install crond

# 启动
systemctl start crond

# 重启
systemctl restart crond

# 关闭
systemctl enable crond

# 查看 at 定时任务服务是否开启
systemctl status crond  # 或者 ps aux | grep cron

# 基础语法
crontab [选项]

# 选项: 查看、编辑、删除定时任务
-l             # 显示当前用户已配置的所有定时任务
-e             # 增加、修改定时任务,相当于 vim /etc/cron.d
-r             # 删除所有定时任务,慎用!会删除当前用户的所有定时任务,无确认步骤,如果只想删除一个则使用 crontab -e
  1. cron 执行定时任务
shell
# 基础语法(五星)
* * * * *  要执行的 linux 命令
- - - - -
| | | | |
| | | | +--- 星期 (0-6, 0=周日 7=周日)
| | | +----- 月份 (1-12)
| | +------- 日期 (1-31)
| +--------- 小时 (0-23)
+----------- 分钟 (0-59)

# 特殊符号
* 星号 代表任意时间,比如:第一个是 *,意思就是一小时中的每一分钟都执行一遍命令
, 逗号 代表不连续的时间,比如:0 8,12,16 * * *,意思就是每天的8点0分,12点0分,16点0分都执行一遍命令
- 减号 代表联系时间范围,比如:0 5 * * 1-6,意思就是周一到周六的凌晨5点都执行一遍命令
*/n 代表每隔多久执行一次,比如:*/10 * * * * ,代表每隔10分钟执行一遍命令

# 示例
* * * * * /home/user/script.sh    # 每分钟执行一次 /home/user/script.sh 脚本
0 3 * * * /home/user/backup.sh    # 每天凌晨 3 点执行 /home/user/backup.sh 脚本
30 17 * * 5 /home/user/cleanup.sh # 每周五下午 5 点 30 分执行 /home/user/cleanup.sh 脚本
0 0 1,15 * * /home/user/check.sh  # 每月 1 日和 15 日的午夜执行 /home/user/check.sh 脚本
10 */1 * * * /home/user/monitor.sh  # 每小时的第 10 分钟执行 /home/user/monitor.sh
5 5 * * 2 /sbin/shutdown -r now # 每周二的凌晨 5 点 05 分重启系统

# 设置定时任务
方式一(命令行执行):* * * * *  要执行的 linux 命令
方式二(修改配置文件):vim /etc/crontab ,格式:格式:* * * * * 用户名 执行的命令
  1. 权限控制(白名单和黑名单,控制哪些用户可使用此命令)
shell
ls /etc/ | grep cron   # 查看 cron 所有配置文件
vim /etc/cron.deny                        # 黑名单,禁止使用 cron 的用户列表(默认存在,为空则允许所有用户)
vim /etc/cron.allow                       # 白名单,允许使用 cron 的用户列表(优先级高于 at.deny)
  1. 注意事项
shell
1. 格式的 5 个选项都不能为空,不确定的使用 * 代表任意时间
2. crontab 定时任务,最小有效时间1分钟,最大时间范围是月,没有秒和年
3. 在定义时间时,日期和时间不要同时出现,否则二者的关系是 or 的关系,不是 and 的福安县
4. 在定时任务中,写命令或者脚本时,必须使用绝对路径,相对有时会报错
5. 天数和星期同时出现,那么定义的时间是并列的,将同时执行
6. 尽量不要把天数设置成30、31天,因为小月份是没有30、31号的将不会执行此命令
7. * 值只能是整数,不可以是小数
  1. 对 系统关机或未运行而错过执行时间的周期性任务 处理(默认即可,无需更改)
shell
# 执行
vim /etc/anacrontab

# 内容如下
RANDOM_DELAY=45                                       延迟多长时间执行,默认45分钟
START_HOURS_RANGE=3-22                                在哪个时间段执行,默认凌晨3点到22点

1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

在 linux 中,服务管理主要通过 systemd(CentOS 7+ 默认)或 sysvinit(CentOS 6 及更早版本)实现

systemd(CentOS 7+)

systemd 是新一代初始化系统,通过 systemctl 命令管理服务,配置文件通常位于 /usr/lib/systemd/system/ 或 /etc/systemd/system/。

shell
# 基础语法
systemctl [选项] 服务名

# 基础操作
systemctl start httpd  # 启动服务
systemctl stop httpd  # 停止服务
systemctl restart httpd  # 重启服务
systemctl reload httpd  # 重新加载配置(不中断服务)
systemctl status httpd  # 查看服务状态,active (running) 运行中,inactive (dead) 已停止

# 开机自启管理
systemctl enable httpd  # 设置开机自启
systemctl disable httpd  # 关闭开机自启
systemctl enable --now 服务名 # 立即启动并设置开机自启
systemctl is-active httpd  # 仅查看是否活跃(active/inactive)
systemctl is-enabled httpd  # 查看是否开机自启(enabled/disabled)

# 查看、屏蔽
systemctl list-units --type=service  # 查看当前活跃的服务
systemctl list-units --type=service --all | grep 服务名关键词  # 查看所有服务(包括未活跃的),再 grep 过滤
systemctl list-unit-files --type=service # 查看所有服务的开机自启状态
systemctl list-dependencies httpd  # 查看服务依赖
systemctl mask httpd # 屏蔽服务(禁止手动 / 自动启动)
systemctl unmask httpd  # 取消屏蔽

# 配置文件所在
/usr/lib/systemd/system/  # 系统默认服务,修改后需要再执行 systemctl daemon-reload 才生效
/etc/systemd/system/  # 用户自定义或修改的服务,修改后需要再执行 systemctl daemon-reload 才生效
systemctl daemon-reload  # 重新加载配置文件

sysvinit(CentOS 6 及更早)

通过 service 和 chkconfig 命令管理,服务脚本位于 /etc/init.d/。

shell
# 基础操作
service httpd start  # 启动服务
service httpd stop  # 停止服务
service httpd restart # 重启服务
service httpd reload  # 重新加载配置(不中断服务)
service httpd status  # 查看服务状态,active (running) 运行中,inactive (dead) 已停止

# 开机自启管理
chkconfig httpd on  # 设置开机自启
chkconfig httpd off  # 关闭开机自启
chkconfig --list httpd # 查看是否开机自启
chkconfig --list # 列出所有服务自启状态

# 查看
systemctl list-units --type=service  # 列出所有服务状态,加 --all 显示包括未运行的服务
systemctl list-units --type=service --all | grep 服务名关键词  # 搜索服务
systemctl list-dependencies httpd  # 查看服务依赖

# 临时禁用服务
systemctl mask httpd # 禁止手动或自动启动(强制禁用)
systemctl unmask httpd  # 解除禁用

通用配置

shell
# 服务配置文件路径
多数服务的配置文件在 /etc/服务名/(如 httpd /etc/httpd/)

# 日志查看
服务日志通常在 /var/log/ 目录(如 httpd 日志在 /var/log/httpd/),或通过 journalctl -u 服务名(systemd 系统)查看。

# 手动编写服务
systemd 服务需创建 .service 配置文件(参考 /usr/lib/systemd/system/ 下的示例);sysvinit 需编写 /etc/init.d/ 下的启动脚本。

shell
# 基础语法
shutdown [选项] 时间 [警告信息]

# 选项
-c                                     取消已经执行的shutdown命令
-h                                     关机
-r                                     重启

# 示例
shutdown -h now               # 立即关机
shutdown -h 18:33             # 到 10:33 关机,如果该时间小于当前时间,则到明天关机
shutdown -h +10               # 10 分钟后自动关机

shutdown -r now               # 立即重启
shutdown -r +30               # 30 分钟后重启并发送通知给其他在线用户

shutdown -c                   # 如果设置了定时关机,可通过此命令取消