linux进程三件套nohup、ps 和 kill 命令的详细解析
1. nohup
命令详解
nohup ./find_data_change_log_loop_in2m.sh > /dev/null 2>&1 &
-
nohup
-
:忽略挂断信号(SIGHUP),确保终端关闭后进程继续运行
-
-
> /dev/null
-
:将标准输出重定向到空设备(丢弃输出)
-
本质
-
/dev/null
是 Linux/Unix 系统中的一个特殊设备文件,不是普通文件夹。 -
它被称为 "黑洞设备" 或 "空设备",所有写入它的数据会被立即丢弃。
-
/dev/null
是 Linux 内核默认创建的设备节点,无需手动创建。 -
位置固定为
/dev/null
,不可更改或替换。 -
通过
ls -l /dev/null
可查看其属性: -
crw-rw-rw- 1 root root 1, 3 Jul 10 14:30 /dev/null
-
c
表示字符设备 -
1, 3
是设备的主/次编号 -
典型用途
场景 命令示例 丢弃输出 command > /dev/null
静默运行 nohup cmd > /dev/null 2>&1 &
快速清空文件 cat /dev/null > logfile
-
-
-
-
2>&1
:将标准错误(stderr)合并到标准输出(stdout)-
文件描述符(FD)
描述符 名称 默认指向 0 stdin 键盘输入 1 stdout 终端屏幕 2 stderr 终端屏幕 符号含义
-
2>
:重定向 标准错误(stderr) -
&1
:表示 当前标准输出(stdout)的目标 -
组合效果:将 stderr 合并到 stdout 的当前目标
- 工作流程示例
-
# 原始命令(错误和输出分开显示) command 1>output.log 2>error.log # 合并错误到输出 command > combined.log 2>&1 # 等效逻辑: # 1. 先设置 stdout 到 combined.log # 2. 再将 stderr 指向 stdout 的当前目标(即 combined.log)
-
-
常见变体
命令 效果 2>file
仅错误输出到文件 >& file
所有输出到文件(bash简写) 2>/dev/null
仅丢弃错误 -
&
:将进程放到后台运行-
后台运行符 (
&
)command & # 将命令放到后台执行
-
会返回作业号(如
[1] 12345
) -
使用
jobs
查看后台任务 -
echo $((5 & 3)) # 输出1(二进制与运算)
文件描述符引用 (
&1
,&2
)command >file 2>&1 # 错误重定向到输出
逻辑与符 (
&&
)cmd1 && cmd2 # 只有cmd1成功才执行cmd2
位与操作符 (
&
)echo $((5 & 3)) # 输出1(二进制与运算)
-
-
关键特性
部分 | 作用 | 是否必需 |
---|---|---|
nohup | 防止进程因终端退出被杀死 | 是(需持久运行时) |
> /dev/null | 丢弃输出 | 否(生产环境建议保留日志) |
2>&1 | 错误输出合并 | 否(调试时可分开记录) |
& | 后台运行 | 是(否则会阻塞终端) |
典型场景
-
需要长期运行的监控脚本
-
远程SSH会话断开后仍需保持的进程
-
避免输出污染当前终端
改进建议(生产环境)
# 保留日志并自动轮转
nohup ./script.sh >> /var/log/script.log 2>&1 &
2. 进程状态查看 (ps aux | grep
)
命令解析
ps aux | grep find_data_change_log_loop_in2m.sh
-
ps aux
:ps
= Process Status 显示所有用户的所有进程(源自 Unix 系统 V 的进程状态工具)-
a
:显示所有用户的进程 -
u
:显示详细信息(CPU、内存等) -
x
:包括未控制终端的进程(如后台进程)
-
-
grep
:过滤目标进程
输出列说明
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 12345 0.5 1.2 345678 12345 ? S Jul10 10:30 ./find_data_change_log_loop_in2m.sh
-
STAT 状态码:
-
S
:睡眠(可中断) -
R
:运行中 -
T
:暂停(如 Ctrl+Z) -
Z
:僵尸进程 -
D
:不可中断的睡眠(通常为IO操作)
-
更专业的进程查找
# 精确匹配进程名(避免grep自身干扰)
pgrep -f find_data_change_log_loop_in2m.sh
# 查看进程树
pstree -p 12345
# 查看进程打开的文件
lsof -p 12345
3. kill
命令完全指南
基本语法
kill [信号] <PID>
常用信号
信号编号 | 信号名 | 作用 | 场景 |
---|---|---|---|
1 | SIGHUP | 挂起 | 重新加载配置 |
2 | SIGINT | 中断(同Ctrl+C) | 优雅终止 |
9 | SIGKILL | 强制终止 | 进程无响应时 |
15 | SIGTERM | 终止(默认) | 正常关闭 |
典型场景
-
正常停止进程
kill -15 12345 # 发送SIGTERM
-
强制杀死无响应进程
kill -9 12345 # 发送SIGKILL
-
批量停止相关进程
pkill -f "pattern" # 按名称匹配 killall script.sh # 按进程名
注意事项
-
信号传递顺序
应先尝试SIGTERM
,等待5-10秒无效后再用SIGKILL
-
僵尸进程处理
若进程状态为Z
,需杀死其父进程:kill -9 $(ps -o ppid= -p <僵尸PID>)
-
权限限制
-
普通用户只能杀死自己的进程
-
root用户可杀死任何进程
-
-
生产环境安全操作
4. 完整工作流示例
启动监控
nohup ./monitor.sh >> /var/log/monitor.log 2>&1 &
[1] 23456 # 返回进程ID
状态检查
ps -fp 23456
# 输出示例:
# UID PID PPID C STIME TTY TIME CMD
# root 23456 1 0 14:30 ? 00:00:01 ./monitor.sh
优雅停止
kill -15 23456
# 等待5秒后检查
if ps -p 23456 > /dev/null; then
echo "进程未正常退出,强制终止..."
kill -9 23456
fi
清理残留
# 查找所有残留进程
pkill -9 -f "monitor.sh"
# 删除日志(可选)
truncate -s 0 /var/log/monitor.log
5. 总结表格
操作 | 命令 | 关键参数 | 风险等级 |
---|---|---|---|
启动后台进程 | nohup cmd & | > /dev/null 2>&1 | 低 |
查找进程 | ps aux | grep | -f (全匹配) | 低 |
正常停止 | kill -15 | -l (列出信号) | 中 |
强制停止 | kill -9 | pkill (批量) | 高 |
状态诊断 | ps -fp | -o ppid (父进程) | 低 |