0

0

Linux怎么使用nohup命令保持进程运行

P粉602998670

P粉602998670

发布时间:2025-09-15 09:45:01

|

352人浏览过

|

来源于php中文网

原创

最直接的方法是使用nohup命令结合&符号,让进程忽略SIGHUP信号并在后台运行,即使终端关闭也能持续执行,同时建议重定向输出到指定日志文件以便追踪。

linux怎么使用nohup命令保持进程运行

在Linux环境下,要让一个进程在终端关闭后依然保持运行,最直接且常用的方法就是结合使用

nohup
命令和
&
符号。
nohup
的全称是 "no hang up",它的作用就是让命令忽略SIGHUP(挂断)信号,而
&
符号则让命令在后台运行。简单来说,就是启动一个进程,告诉系统:“嘿,这个程序即使我走了,你也得给我继续跑着,别停!”

解决方案

nohup
命令的核心在于它能让进程脱离控制终端。当你通过SSH连接到一个远程服务器,或者在一个本地终端中启动一个耗时任务,一旦终端关闭,通常会发送SIGHUP信号给所有子进程,导致它们随之终止。
nohup
就是为了规避这一点。

其基本用法是:

nohup your_command [args...] &

这里有几个关键点需要说明:

  1. nohup
    : 这是命令本身,它确保
    your_command
    在接收到SIGHUP信号时不会终止。
  2. your_command [args...]
    : 你真正想要执行的命令及其参数。
  3. &
    : 这个符号非常重要,它告诉shell立即将
    your_command
    放到后台执行,这样你就可以继续使用当前终端,而不用等待命令执行完毕。

一个更完善的用法,通常还会涉及到标准输出和标准错误的重定向,因为

nohup
默认会将这些输出重定向到当前目录下的
nohup.out
文件。但如果
nohup.out
不可写,或者你希望自定义日志文件,就需要手动指定:

nohup your_command > /path/to/your_log_file.log 2>&1 &

  • >
    : 将标准输出重定向到指定文件。
  • 2>&1
    : 这是一个非常常见的写法,它的意思是将标准错误(文件描述符2)也重定向到标准输出(文件描述符1)所指向的地方。这样,无论命令是正常输出还是报错,所有信息都会写入同一个日志文件,方便后续排查。

举个例子,我经常需要跑一些Python脚本来处理数据,可能要跑几个小时甚至几天。我通常会这么启动:

nohup python3 my_data_processor.py --input data.csv > processing_log.txt 2>&1 &
这样,即使我的SSH连接断了,或者我关了笔记本,脚本依然会在服务器上默默运行,所有输出和错误都会记录在
processing_log.txt
里。

Linux怎么使用nohup命令保持进程运行

nohup命令的输出重定向有什么讲究?

在我看来,

nohup
命令的输出重定向是其使用过程中最容易被忽视,但又至关重要的一环。很多人可能只知道
nohup command &
,然后就发现当前目录下多了一个
nohup.out
文件。这当然可以,但在实际生产环境或更复杂的任务中,这种默认行为往往不够灵活或不符合预期。

首先,

nohup
默认会将标准输出(stdout)和标准错误(stderr)都重定向到
nohup.out
文件。如果当前目录不可写,它会尝试重定向到用户家目录下的
nohup.out
。如果两者都不可写,那么输出可能会丢失,或者直接输出到终端,这显然就失去了后台运行的意义。

我个人更倾向于明确指定日志文件路径和名称,并且统一处理标准输出和标准错误。这通常通过

> /path/to/your_log.log 2>&1
来实现。

  • 为什么统一处理? 想象一下,你的程序正常运行的日志写到了
    stdout.log
    ,但突然崩溃了,错误信息却跑到了
    stderr.log
    。当你想排查问题时,就得同时检查两个文件,这无疑增加了复杂性。把它们都导向一个文件,能让你在一个地方看到完整的执行记录,无论是程序的正常进度还是潜在的错误信息。这在调试和监控时简直是福音。
  • 日志文件的位置和命名:我建议根据项目的需要,将日志文件放在一个专门的日志目录下(比如
    /var/log/my_app/
    或项目根目录下的
    logs/
    ),并采用有意义的命名方式,比如
    my_script_$(date +%Y%m%d%H%M%S).log
    ,这样每次启动都能生成一个带时间戳的独立日志文件,避免覆盖,方便回溯历史记录。
  • 日志轮转:如果你的程序会产生大量的日志,那么日志文件可能会变得非常庞大,占用大量磁盘空间。这时候就需要考虑日志轮转(log rotation)了,比如使用
    logrotate
    工具。虽然
    nohup
    本身不提供这个功能,但这是你规划日志管理时需要考虑的一个重要方面。

所以,与其依赖

nohup.out
,不如从一开始就养成好习惯,为你的后台进程配置清晰、可控的日志输出。这不仅仅是为了满足
nohup
的需求,更是为了程序的健壮性和可维护性。

Linux怎么使用nohup命令保持进程运行

如何检查使用nohup启动的进程是否仍在运行,以及如何终止它们?

当你把一个进程扔到后台,并且脱离了终端,自然会想知道它是不是还在尽职尽责地跑着,或者万一出问题了,怎么把它揪出来干掉。

PathFinder
PathFinder

AI驱动的销售漏斗分析工具

下载

检查进程运行状态:

我通常会用

ps
命令结合
grep
来查找。

  1. 根据进程名查找:
    ps aux | grep [你的程序名或关键词]
    例如,如果我跑的是
    python3 my_data_processor.py
    ,我会这样搜:
    ps aux | grep my_data_processor.py
    或者更精确一点,避免
    grep
    自身被搜到:
    ps aux | grep -v grep | grep my_data_processor.py
    -v grep
    的意思是排除包含
    grep
    关键词的行。
  2. 根据
    nohup
    关键词查找:
    有时候,你可能不记得具体的程序名,但知道它是用
    nohup
    启动的。
    ps aux | grep nohup
    这种方式可能会列出所有通过
    nohup
    启动的进程,你需要从结果中识别出你想要的那个。
  3. 查看进程的父ID (PPID): 一个重要的判断依据是进程的 PPID。如果一个进程的 PPID 是
    1
    (通常是
    init
    systemd
    进程),那么它就意味着它已经脱离了原始的父进程(你的shell),独立运行了。这正是
    nohup
    的效果。
    ps -ef | grep [你的程序名]
    在输出结果中,第二列是 PID,第三列是 PPID。

终止进程:

一旦你找到了进程的 PID (Process ID),终止它就相对简单了。

  1. 温柔地终止 (SIGTERM):
    kill [PID]
    这是最推荐的方式,它会发送一个
    SIGTERM
    信号给进程,给它一个机会来优雅地关闭,比如保存数据、释放资源等。
  2. 强制终止 (SIGKILL):
    kill -9 [PID]
    如果
    kill [PID]
    无效,进程拒绝退出,你可以使用
    kill -9
    。这会发送
    SIGKILL
    信号,强制进程立即终止,不给它任何清理的机会。这就像直接拔电源,可能会导致数据丢失或文件损坏,所以要慎用。
  3. 通过进程名终止 (慎用):
    pkill [你的程序名]
    pkill
    命令可以直接根据进程名终止进程,但它会终止所有匹配该名称的进程。如果你有多个同名进程在运行,这可能会误伤无辜。除非你非常确定只有一个实例在运行,否则我不太推荐这种方式。

需要注意的是,通过

nohup
启动的进程,因为它已经脱离了shell,所以你无法通过
jobs
命令来查看或管理它。
jobs
命令只能列出当前shell会话中处于后台的进程。

Linux怎么使用nohup命令保持进程运行

除了nohup,还有哪些方法可以在Linux中保持进程后台运行或在会话断开后继续执行?

其实吧,除了

nohup
这种简单粗暴但有效的办法,Linux世界里还有不少更“高级”或更“正规”的工具和方法来管理后台进程,它们各有侧重,适用于不同的场景。

  1. 使用

    screen
    tmux
    (会话管理工具)
    这是我个人非常喜欢,也觉得功能最强大的方案之一。
    screen
    tmux
    都允许你创建虚拟终端会话。你可以在这些会话中启动程序,然后“分离”(detach)会话,即使你的SSH连接断开,会话和其中运行的程序依然会在服务器上保持运行。当你需要时,可以随时“重新连接”(re-attach)到这个会话,就像你从未离开过一样,甚至能看到程序的实时输出,并继续与之交互。

    • 优点: 极度灵活,可以管理多个会话,随时查看和交互,非常适合长时间运行的交互式任务或需要频繁检查进度的任务。
    • 缺点: 需要先启动
      screen
      tmux
      会话,然后在这个会话中运行你的命令。对于只想简单启动一个后台进程的情况,可能显得有点“重”。
    • 简单用法:
      • 启动一个新的
        screen
        会话:
        screen
      • screen
        会话中运行你的命令:
        your_command
      • 分离会话(不关闭):
        Ctrl+A D
      • 重新连接会话:
        screen -r
        (如果有多个会话,需要指定会话ID)
  2. 将进程作为

    systemd
    服务运行 (系统级服务管理) 对于那些需要长期稳定运行、开机自启、并且需要系统级管理和监控的程序,例如Web服务器、数据库、定时任务守护进程等,将其配置为
    systemd
    服务是最标准、最推荐的做法。

    • 优点:
      • 开机自启: 系统启动时自动运行。
      • 可靠性:
        systemd
        可以配置在进程崩溃时自动重启,保证服务持续可用。
      • 统一管理: 所有服务都在
        systemctl
        的框架下管理,方便查看状态、启动、停止等。
      • 资源控制: 可以设置资源限制。
    • 缺点: 配置相对复杂,需要编写
      .service
      文件,不适合临时的、一次性的后台任务。
    • 大致流程:
      • /etc/systemd/system/
        目录下创建一个
        .service
        文件 (例如
        my_app.service
        )。
      • 配置
        [Unit]
        [Service]
        [Install]
        等段落,指定
        ExecStart
        (你的程序路径)、
        WorkingDirectory
        User
        Restart
        策略等。
      • sudo systemctl daemon-reload
        (重新加载
        systemd
        配置)。
      • sudo systemctl enable my_app
        (设置开机自启)。
      • sudo systemctl start my_app
        (启动服务)。
      • sudo systemctl status my_app
        (查看服务状态)。
  3. 使用

    disown
    命令 (针对已在后台运行的进程)
    disown
    命令与
    nohup
    有点类似,但它作用于已经通过
    &
    符号放到后台的进程
    。如果你不小心忘记用
    nohup
    启动了一个进程,但它已经在后台运行了,并且你不想让它在终端关闭时终止,那么
    disown
    就能派上用场。

    • 用法:
      1. 先将命令放到后台:
        your_command &
      2. 查看后台任务列表:
        jobs
        (会显示类似
        [1]+ Running your_command &
        的信息)
      3. 使用
        disown
        命令:
        disown -h %1
        (这里的
        %1
        jobs
        命令显示的作业号) 或者,如果你知道进程的 PID,也可以用
        disown -h [PID]
    • 优点: 补救措施,可以在事后让进程脱离终端。
    • 缺点: 只能对当前shell会话中已知的后台作业生效,不能用于启动新进程。

在我看来,

nohup
适合快速、临时性的后台任务;
screen
tmux
适合需要交互或频繁检查进度的长时间任务;而
systemd
则是生产环境中管理关键服务的首选。选择哪种方法,完全取决于你的具体需求和使用场景。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.11.24

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

386

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2111

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

420

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

478

2023.10.16

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.6万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号