Linux使用经验——离线运行python脚本

Linux使用经验(一)------离线运行python脚本

nohup 是 Linux/Unix 系统中用于忽略挂起信号(SIGHUP)的命令,结合 Python 执行代码时,能实现后台持续运行脚本(即使终端断开、

一、基础用法

1. 核心命令格式
bash 复制代码
nohup python [Python参数] 脚本名.py [脚本参数] > 输出日志文件 2>&1 &
部分 说明
nohup 核心命令,忽略挂起信号,保证程序后台运行
python Python 解释器(可替换为 python3/python3.9 等指定版本)
[Python参数] Python 运行参数(如 -u 禁用缓冲、-O 优化执行、-m 运行模块等)
脚本名.py 要执行的 Python 脚本(绝对路径/相对路径)
[脚本参数] 传递给 Python 脚本的参数(脚本内可通过 sys.argv 获取)
> 输出日志文件 重定向标准输出(stdout)到指定文件(默认生成 nohup.out
2>&1 将标准错误(stderr)重定向到标准输出(最终写入同一个日志文件)
& 将进程放入后台运行(终端可继续执行其他命令)
2. 最简示例

执行 test.py,日志默认写入 nohup.out

bash 复制代码
nohup python3 test.py &
3. 自定义日志文件(推荐)

将日志写入 test.log,方便后续排查问题:

bash 复制代码
nohup python3 -u test.py > test.log 2>&1 &
  • 关键参数 -u:禁用 Python 输出缓冲,保证日志实时写入文件(否则日志可能延迟显示)。
4. 传递脚本参数

如果脚本需要接收参数(如 test.py 需传入 --mode prod --port 8080):

bash 复制代码
nohup python3 -u test.py --mode prod --port 8080 > test.log 2>&1 &

脚本内可通过 sys.argvargparse 解析参数。

二、关键操作

1. 查看后台运行的 Python 进程
bash 复制代码
# 方法1:查看所有后台进程(含nohup启动的)
jobs -l

# 方法2:过滤Python进程(更精准)
ps -ef | grep python3 | grep test.py

# 方法3:仅显示进程ID(PID)
pgrep -f test.py
2. 终止后台运行的 Python 进程

找到进程 PID 后,用 kill 命令终止:

bash 复制代码
# 正常终止(推荐,允许程序清理资源)
kill [PID]

# 强制终止(程序无响应时使用)
kill -9 [PID]

示例:

bash 复制代码
# 先查PID
ps -ef | grep test.py  # 假设输出 PID 为 12345
# 再终止
kill 12345
3. 查看实时日志
bash 复制代码
# 实时跟踪日志输出(类似 tail -f)
tail -f test.log

# 查看最后100行日志
tail -n 100 test.log

# 查看全部日志
cat test.log

三、进阶技巧

1. 后台运行虚拟环境中的 Python

如果脚本依赖虚拟环境,需指定虚拟环境的 Python 解释器路径:

bash 复制代码
# 假设虚拟环境在 ~/venv 下
nohup ~/venv/bin/python3 -u test.py > test.log 2>&1 &
2. 避免日志文件过大

结合 logrotate 分割日志,或直接限制日志大小(示例:日志超过 100MB 则覆盖):

bash 复制代码
nohup python3 -u test.py > >(tail -c 100M) 2>&1 &
3. 开机自启(以 systemd 为例)

如果需要脚本开机自动运行,可创建 systemd 服务:

  1. 创建服务文件:

    bash 复制代码
    sudo vim /etc/systemd/system/test.service
  2. 写入内容:

    ini 复制代码
    [Unit]
    Description=Python Test Script
    After=network.target
    
    [Service]
    Type=simple
    User=root  # 替换为实际运行用户
    ExecStart=/usr/bin/python3 -u /path/to/test.py  # 替换为实际脚本路径
    Restart=on-failure  # 程序崩溃时自动重启
    StandardOutput=append:/path/to/test.log  # 日志输出
    StandardError=append:/path/to/test.log
    
    [Install]
    WantedBy=multi-user.target
  3. 启用并启动服务:

    bash 复制代码
    sudo systemctl daemon-reload
    sudo systemctl enable test.service
    sudo systemctl start test.service

四、常见问题

  1. 日志无输出

    • 忘记加 -u 参数,Python 缓冲输出导致日志延迟,添加 -u 即可。
    • 日志文件权限不足,检查文件所属用户和权限(chmod 777 test.log 临时测试)。
  2. 进程莫名终止

    • 脚本本身抛出未捕获的异常,查看日志文件排查错误。
    • 系统资源不足(内存/CPU 耗尽),通过 dmesgtop 排查。
    • 终端关闭时仍发送了 SIGHUP 信号,确认命令末尾加了 &
  3. 中文日志乱码

    • 在脚本开头设置编码:

      python 复制代码
      import sys
      sys.stdout.reconfigure(encoding='utf-8')
      sys.stderr.reconfigure(encoding='utf-8')

总结

核心命令:nohup python3 -u 脚本.py > 日志文件 2>&1 &

关键参数:-u(实时日志)、2>&1(合并错误输出)、&(后台运行)

运维技巧:结合 ps/kill 管理进程、tail -f 查看日志、systemd 实现开机自启。

相关推荐
烂蜻蜓19 分钟前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
库玛西21 分钟前
深入浅出传输层:UDP 与 TCP 协议全景指南
linux·服务器·网络·c++·笔记·tcp/ip·udp
jay神36 分钟前
【计算机毕业设计】基于Flask+Vue的电影数据可视化与智能推荐系统
前端·vue.js·python·信息可视化·flask·毕业设计·课程设计
满怀冰雪1 小时前
24-PaddleClas 模型评估、导出与推理部署入门
大数据·人工智能·python·深度学习·paddle
薛定谔的悦4 小时前
储能 EMS 的功率策略:从一块电表到一次逆流的 200 毫秒
大数据·linux·能源·储能·bms
DeepVisionary7 小时前
谷歌 Gemini Omni 1.1 Flash 正式发布:4K 视频、40 秒场景延伸,视频生成进入按 token 计费时代
python·自动化
新时代牛马7 小时前
Linux 内核入门地图:架构、源码目录与五大子系统
linux·运维·架构
阡之尘埃7 小时前
Python数据分析案例85——大模型微调全流程(SFT的LoRA微调)
人工智能·python·深度学习·语言模型·llm·微调·千问
海兰7 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(三)
javascript·python·金融
Julien20048 小时前
控制 SELinux 文件上下文
linux·运维·服务器