Linux使用技巧

Linux使用技巧

Linux: 后台运行进程

在 Linux 中,将当前进程放到后台运行并确保在关闭终端后仍持续运行,可以通过以下步骤实现:


方法 1:使用 nohup + &(推荐)

  1. 启动时直接后台运行
    在命令前加 nohup,末尾加 &

    nohup your_command > output.log 2>&1 &

    nohup:忽略挂断信号(SIGHUP),防止终端关闭时进程被终止。
    > output.log:将标准输出重定向到文件(默认会输出到 nohup.out)。
    2>&1:将错误输出合并到标准输出。
    &:让进程在后台运行。

  2. 查看后台进程

    jobs -l       # 查看当前终端的后台任务
    ps aux | grep your_command # 全局查找进程
  3. 关闭终端后仍运行
    进程会脱离当前终端,由 init 进程(PID=1)接管,即使关闭终端也不会终止。


方法 2:使用 disown(针对已运行的进程)

如果进程已在前台运行:

  1. Ctrl + Z 暂停进程。
  2. 输入 bg 将其转为后台运行。
  3. 使用 disown 移除进程与终端的关联:
    disown -h %1  # %1 是作业编号(通过 `jobs` 查看)
    此时关闭终端不会影响进程。

方法 3:使用 screentmux(会话管理)

  1. 创建持久会话
    screen -S session_name  # 新建会话
    tmux new -s session_name
  2. 在会话中运行命令
    直接执行你的命令(无需 nohup&)。
  3. 分离会话
    Ctrl + A + D(screen)或 Ctrl + B + D(tmux)分离会话。
  4. 关闭终端后重新连接
    screen -r session_name  # 恢复会话
    tmux attach -t session_name
    会话中的进程会持续运行。

方法 4:使用 systemd(系统级服务,适合长期运行)

  1. 创建服务文件(如 /etc/systemd/system/your_service.service):
    [Unit]
    Description=Your Service

    [Service]
    ExecStart=/path/to/your_command
    Restart=always
    User=your_username

    [Install]
    WantedBy=multi-user.target
  2. 启用并启动服务:
    sudo systemctl enable your_service
    sudo systemctl start your_service
    进程会作为守护进程运行,不受终端影响。

关键区别

方法 适用场景 是否需要提前准备 终端关闭后效果
nohup 简单临时任务 持续运行
disown 已运行的前台任务 持续运行
screen 交互式或需要恢复的进程 需安装 会话持久化
systemd 长期后台服务 需配置 系统级守护进程

验证进程是否存活

关闭终端后,通过以下命令检查:

ps aux | grep your_command  # 查看进程是否存在
pstree -p | grep your_command # 检查进程父ID是否为1(init)

选择最适合你场景的方法即可!

检查进程是否退出

你的 python main.py 进程(PID 1611)确实在运行,但它的状态是 Rl(运行中,多线程),并且 CPU 占用很高(205%,说明是多核运行)。

为什么 Ctrl+Z + bg 后关闭终端,进程仍然存活?

通常 Ctrl+Z + bg 后直接关闭终端会导致进程被终止,但你的情况可能有以下几种原因:

  1. 进程已经脱离终端(可能是 nohupdisownscreen 启动的)。
  2. Shell 配置特殊(如 huponexit 被关闭)。
  3. 进程自己处理了 SIGHUP(某些 Python 程序会忽略终端挂断信号)。

如何确认进程是否会随终端关闭而终止?

1. 检查进程的父进程(PPID)

pstree -p | grep 1611

• 如果父进程是 init(PID=1)或 systemd,说明它已经脱离终端,关闭终端不会影响它。
• 如果父进程是你的 Shell(如 bash,PID=xxxx),关闭终端后它会被终止。

2. 检查进程是否被 nohup 启动

ps -fp 1611

• 如果 COMMAND 列显示 nohup python main.py,说明它受 nohup 保护。

3. 检查 huponexit 设置

shopt | grep huponexit

• 如果输出 huponexit off,说明 Shell 不会在退出时发送 SIGHUP(你的进程可能因此存活)。


如何确保进程在关闭终端后继续运行?

方法 1:用 disown 移除关联(如果还在当前 Shell 中)

jobs -l           # 查看作业号(如 %1)
disown -h %1 # 移除与终端的关联

然后可以安全关闭终端。

方法 2:用 screen / tmux 托管(推荐)

screen -S my_python_session
python main.py # 直接运行
Ctrl+A, D # 分离会话

即使关闭终端,进程仍在 screen 会话中运行,后续可恢复:

screen -r my_python_session

方法 3:用 nohup 重新启动

nohup python main.py > output.log 2>&1 &

这样即使关闭终端,进程也会继续运行。


总结

你的 python main.py 已经在运行,但不确定是否会受终端关闭影响。
pstree -p | grep 1611 检查父进程,确认是否脱离终端。
如果想确保安全,可以用 disownscreennohup 管理。

如果仍有疑问,可以贴出 pstree -p 1611ps -fp 1611 的输出,我可以帮你进一步分析!