当前位置: 首页 > news >正文

ubuntu20.04使用systemd服务设置python程序开机自启动

1. 使用 systemd 服务设置开机自启动

  1. 假设已经有一个可执行的python程序,然后用一个sh脚本去启动python程序,正常情况使用挂起的方式nohup启动,日志输出到指定文件:
sudo touch run.sh
sudo chmod 777 run.sh

sh文件内容如下,-u可以把print的打印也输出到nohup.log文件中,使用./run.sh即可在后台运行python程序:

#! /bin/bash
nohup /usr/bin/python3 -u test.py > nohup.log 2>&1 &
  1. 在/etc/systemd/system目录下创建一个service文件,文件内容如下
[Unit]
Description=My Python Program
After=network.target[Service]
Type=simple
ExecStart=/path/to/your/sh/run.sh
WorkingDirectory=/path/to/working/directory
User=your_user
Group=your_group
Environment="PYTHONPATH=/path/to/python/lib"
Restart=on-failure[Install]
WantedBy=multi-user.target
  1. 重新加载 systemd 配置:
sudo systemctl daemon-reload

设置开机自启服务:

sudo systemctl enable my_program.service

立即启动服务:

sudo systemctl start my_program.service

查看服务状态

sudo systemctl status my_program.service
  1. 查看系统日志, -f 可以查看实时日志
journalctl -f -u your_service_name.service
  1. 系统日志太多时,可以删除旧日志,比如清除1天之前的日志
journalctl --vacuum-time=1d

在 Ubuntu 20 中使用 systemd 服务运行 Python 程序时,systemd 有自己的日志管理机制,不会直接生成 nohup.out 文件,而是将服务的输出重定向到系统日志中
7. 可能遇到‘permission denied’的问题,导致无法生成nohup.out文件,也可能生成空的nohup.out文件,直到程序遇到错误,才会生成out文件然后把错误日志输出

2. 建议直接在service文件中运行python程序,不使用nohup,另外配置日志输出

  1. 使用绝对路径
  2. nohup不适合开机启动:nohup主要用于在交互式shell中运行命令,使其在后台运行并忽略挂起(HUP)信号。在开机启动脚本中,你通常不需要nohup,因为这些脚本本身就是在系统启动时以非交互式方式运行的。

service文件内容如下

[Unit]
Description=My Python Program
After=network.target[Service]
Type=simple
ExecStart=/usr/bin/python3 -u /path/to/your/python_program.py
WorkingDirectory=/path/to/working/directory
StandardOutput=file:/home/to/yourfile.log
StandardError=file:/home/to/yourfilerror.log
User=your_user
Group=your_group
Restart=on-failure
Environment="PYTHONPATH=/path/to/python/lib"[Install]
WantedBy=multi-user.target

3. 停止删除服务

  1. 禁用并停止服务
    sudo systemctl stop your_service_name.servicesudo systemctl disable your_service_name.service
  1. 删除服务文件(可选):
    sudo rm /etc/systemd/system/your_service_name.service

相关文章:

  • [笔记]ONVIF服务端实现[进行中...]
  • 1.Spring Boot 简介(Spring MVC+Mybatis-plus)
  • oracle 查询锁表
  • JS 鼠标拖动实现移动滚动条的滚动效果
  • pageoffice常见问题处理
  • 算法 —— 暴力枚举
  • Godot入门 04平台设计
  • UE4-构建光照后导入的静态网格体变黑
  • c++中的scanf
  • Midjourney绘画提示词精选
  • 使用 nmcli 管理网络连接
  • 【Python机器学习】决策树的构造——信息增益
  • 网络安全自学从入门到精通的制胜攻略!!!
  • 【调色板软件】免费、开源的调色板软件,焰火十二卷,提供了多种功能来生成一组调和色彩NO.108
  • vue3+vite 实现动态引入某个文件夹下的组件 - glob-import的使用
  • php的引用
  • 10个最佳ES6特性 ES7与ES8的特性
  • download使用浅析
  • git 常用命令
  • JavaScript类型识别
  • nodejs:开发并发布一个nodejs包
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue--为什么data属性必须是一个函数
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何使用 JavaScript 解析 URL
  • MyCAT水平分库
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #HarmonyOS:Web组件的使用
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (13):Silverlight 2 数据与通信之WebRequest
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (C++哈希表01)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (三)uboot源码分析
  • .cfg\.dat\.mak(持续补充)
  • .env.development、.env.production、.env.staging
  • .form文件_一篇文章学会文件上传
  • .md即markdown文件的基本常用编写语法
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Framework杂记
  • .net 后台导出excel ,word
  • .net 使用ajax控件后如何调用前端脚本
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 依赖注入和配置系统
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .NET简谈设计模式之(单件模式)
  • .NET微信公众号开发-2.0创建自定义菜单
  • .NET周刊【7月第4期 2024-07-28】
  • @selector(..)警告提示
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——