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 实现开机自启。

相关推荐
想会飞的蒲公英4 小时前
计算机怎样读取中文文本:编码、清洗与标准化
人工智能·python·自然语言处理
SeaTunnel5 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
深度研习笔记5 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
一叶龙洲5 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
CCPC不拿奖不改名5 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github
Marst Code6 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
databook6 小时前
当散点图不够用时:用 t-SNE 可视化多维数据
python·数据分析·数据可视化
星恒讯工业路由器7 小时前
5G FWA技术演进与趋势
网络·5g·信息与通信·4g·5g fwa·3gpp规范·fwa趋势
敖行客 Allthinker7 小时前
Parallels Ubuntu虚拟机项目如何让手机访问?完整解决方案
linux·运维·ubuntu
keyipatience8 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu