Linux Service
工作需要后台自启一个小python程序,环境ubuntu 18.04 ,也就是去了rc的版本
- 写在.profile里配合自动登陆,需要图像界面启动才能启动,不稳定
- /etc/init.d 么的用,未排查具体原因
- /etc/systemd/system/my.service 非常好用
记录一下service的用法
- 基本框架:参考这篇博客Service Details
(如果不知道怎么写,可以看同目录下其他服务照猫画虎)
# 一些重要的区块
[Unit]
# 定义启动顺序,下面代表在A.target之前, B.service之后启动my.service
# 注意:该字段无依赖关系,如果B和my有依赖关系,需要写在Wants,Require, 这里的依赖可以视为同时启动的意思
# Wants: 弱依赖 if C exits, my running
# Requires: 强依赖 if D exits, my exits
Before=A.target
After=B.service
Wants=C.service
Require=D.service
# 结论: 上述的启动顺序为, (B then C & D & my then A) and (If D is None : my exits)
[Service]
# 有很多字段,类似Exec*, 按照*的字面意思理解就可以,这里的Start就是启动时的命令
ExecStart=$EXEPATH/exe $SCRIPTS/my_scripts
# 这里还可以定义启动Type=, 具体看教程, 我没有用到
# 重启行为定义字段,后两个的区别是前者包括信号终止,后者只有超时重启
Restart=on-failure/on-abnormal/on-watchdog
[Install]
# 定义如何安装service文件,即我们怎么启动service
WantedBy=multi-user.target
# 这里的target是一组服务,在etc/systemd/system/目录下有一个该目标服务组想要的文件夹,存储指向安装服务的软连接。
# multi-user.target 是一个linux默认运行的服务组
# 图形服务组和其依赖可见[官方文档](https://www.freedesktop.org/software/systemd/man/bootup.html#System%20Manager%20Bootup)
在保存好服务文件后需要进行systemctl daemon-reload
- 一些小问题:
- 用户问题:看日志发现有为根目录用户关闭进程,发生在我使用/bin/bash打开shell文件后使用/usr/bin/python3打开python文件。解决方法:直接打开python文件
- 日志输出问题:写py文件时没有定义日志输出功能。解决:ExecStart 中重定向至log.txt文件
- python的模块依赖问题,设定运行顺序在默认服务组后启动或软关联。