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 auxps = 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 [信号] 
常用信号
信号编号 信号名 作用 场景
1 SIGHUP 挂起 重新加载配置
2 SIGINT 中断(同Ctrl+C) 优雅终止
9 SIGKILL 强制终止 进程无响应时
15 SIGTERM 终止(默认) 正常关闭
典型场景
  1. 正常停止进程

    kill -15 12345  # 发送SIGTERM
  2. 强制杀死无响应进程

    kill -9 12345   # 发送SIGKILL
  3. 批量停止相关进程

    pkill -f "pattern"  # 按名称匹配
    killall script.sh   # 按进程名
注意事项
  1. 信号传递顺序
    应先尝试 SIGTERM,等待5-10秒无效后再用 SIGKILL

  2. 僵尸进程处理
    若进程状态为 Z,需杀死其父进程:

    kill -9 $(ps -o ppid= -p <僵尸PID>)
  3. 权限限制

    • 普通用户只能杀死自己的进程

    • root用户可杀死任何进程

  4. 生产环境安全操作

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 (父进程)

你可能感兴趣的:(linux,运维)