linux后台运行python脚本

xyh0703 / 2024-11-07 / 原文

一、使用sytemctl 运行service

准备需要运行的脚本HelloWorld.py,配置文件HelloWorld.servce

十秒打印一次日志

import time
import logging

# 配置日志记录器
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')

while True:
    # 使用logging.info来记录信息
    logging.info("Hello World")
    # 等待10秒
    time.sleep(10)

通过HelloWorld.servce这个配置文件来指定如何运行脚本,可以通过man 5 systemd.sercie获取service文件的说明书,

ExecStart=在启动该服务时需要执行的 命令行(命令+参数)

可以知道unit、service、install这三个部分是必要的,往下翻可以找到相应的模板

[Unit]
Description=Foo

[Service]
ExecStart=/usr/sbin/foo-daemon

[Install]
WantedBy=multi-user.target

 linux文件系统中有三个文件夹专门用于存放配置文件

/etc/systemd/system #
/usr/lib/systemd/system # 一般为安装软件存在的配置文件

 在/etc/systemd/system 文件夹下面创建HelloWorld.service

[Unit]
Description=Hello World #对于该配置文件的额描述

[Service]
ExecStart=/usr/bin/python3 /root/HelloWorld.py # 使用python3来执行后面这个脚本

[Install]
WantedBy=multi-user.target

 接下来就可以启动服务,运行这个脚本了

[root@192 system]# systemctl start HelloWorld
[root@192 system]# systemctl status HelloWorld
● HelloWorld.service - Hello World
   Loaded: loaded (/etc/systemd/system/HelloWorld.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2024-10-21 07:04:06 PDT; 11s ago
 Main PID: 90135 (python3)
    Tasks: 1 (limit: 49646)
   Memory: 4.6M
   CGroup: /system.slice/HelloWorld.service
           └─90135 /usr/bin/python3 /root/HelloWorld.py

10月 21 07:04:06 192.168.136.128 systemd[1]: Started Hello World.
10月 21 07:04:06 192.168.136.128 python3[90135]: 2024-10-21 07:04:06 - Hello World
10月 21 07:04:16 192.168.136.128 python3[90135]: 2024-10-21 07:04:16 - Hello World

启动一个服务:systemctl start servicename
停止一个服务:systemctl stop servicename

重启一个服务:systemctl restart servicename

重新加载一个服务的配置:systemctl reload servicename

查看一个服务的状态:systemctl status servicename

显示一个服务的所有信息:systemctl show servicename

启用一个服务,使其在系统启动时自动启动:systemctl enable servicename

禁用一个服务,使其在系统启动时不自动启动:systemctl disable servicename

通过journalctl -u HelloWorld.service 可以查看这个服务运行的所有日志

root@192 system]# journalctl -u HelloWorld.service 
-- Logs begin at Fri 2024-10-11 06:42:39 PDT, end at Mon 2024-10-21 07:11:50 PDT. --
10月 21 06:06:58 192.168.136.128 systemd[1]: Started Hello World.
10月 21 06:08:37 192.168.136.128 systemd[1]: Stopping Hello World...
10月 21 06:08:37 192.168.136.128 systemd[1]: Stopped Hello World.
10月 21 06:12:45 192.168.136.128 systemd[1]: Started Hello World.
10月 21 06:12:45 192.168.136.128 python3[88547]: 2024-10-21 06:12:45 - Hello World
10月 21 06:12:55 192.168.136.128 python3[88547]: 2024-10-21 06:12:55 - Hello World
10月 21 06:13:05 192.168.136.128 python3[88547]: 2024-10-21 06:13:05 - Hello World
10月 21 06:13:15 192.168.136.128 python3[88547]: 2024-10-21 06:13:15 - Hello World
10月 21 06:13:25 192.168.136.128 python3[88547]: 2024-10-21 06:13:25 - Hello World
10月 21 06:13:35 192.168.136.128 python3[88547]: 2024-10-21 06:13:35 - Hello World
10月 21 06:13:45 192.168.136.128 python3[88547]: 2024-10-21 06:13:45 - Hello World
10月 21 06:13:55 192.168.136.128 python3[88547]: 2024-10-21 06:13:55 - Hello World
10月 21 06:14:05 192.168.136.128 python3[88547]: 2024-10-21 06:14:05 - Hello World
10月 21 06:14:15 192.168.136.128 python3[88547]: 2024-10-21 06:14:15 - Hello World
10月 21 06:14:25 192.168.136.128 python3[88547]: 2024-10-21 06:14:25 - Hello World
10月 21 06:14:28 192.168.136.128 systemd[1]: Stopping Hello World...
10月 21 06:14:28 192.168.136.128 systemd[1]: Stopped Hello World.
10月 21 06:44:59 192.168.136.128 systemd[1]: Started Hello World.
10月 21 06:44:59 192.168.136.128 python3[89614]: 2024-10-21 06:44:59 - Hello World
10月 21 07:04:06 192.168.136.128 systemd[1]: Started Hello World.
10月 21 07:04:06 192.168.136.128 python3[90135]: 2024-10-21 07:04:06 - Hello World
10月 21 07:04:16 192.168.136.128 python3[90135]: 2024-10-21 07:04:16 - Hello World
10月 21 07:04:26 192.168.136.128 python3[90135]: 2024-10-21 07:04:26 - Hello World
10月 21 07:04:36 192.168.136.128 python3[90135]: 2024-10-21 07:04:36 - Hello World

这个服务的定时运行是由脚本控制的,systemd也可以通过.time文件实现脚本的定时运行

二、使用systemd定时运行服务

修改脚本不再实现循环运行

import logging

# 配置日志记录器
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
# 使用logging.info来记录信息
logging.info("Hello World")

启动服务之后查看运行状态,对比之前的输出,Active: inactive (dead)说明这个服务已经运行过了,现在已经结束

[root@192 system]# systemctl status HelloWorld
● HelloWorld.service - Hello World
   Loaded: loaded (/etc/systemd/system/HelloWorld.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

10月 21 07:09:26 192.168.136.128 python3[90135]: 2024-10-21 07:09:26 - Hello World
10月 21 07:09:36 192.168.136.128 python3[90135]: 2024-10-21 07:09:36 - Hello World
10月 21 07:09:46 192.168.136.128 python3[90135]: 2024-10-21 07:09:46 - Hello World
10月 21 07:09:56 192.168.136.128 python3[90135]: 2024-10-21 07:09:56 - Hello World
10月 21 07:10:06 192.168.136.128 python3[90135]: 2024-10-21 07:10:06 - Hello World
10月 21 07:10:16 192.168.136.128 python3[90135]: 2024-10-21 07:10:16 - Hello World
10月 21 07:10:19 192.168.136.128 systemd[1]: Stopping Hello World...
10月 21 07:10:19 192.168.136.128 systemd[1]: Stopped Hello World.
10月 21 07:17:25 192.168.136.128 systemd[1]: Started Hello World.
10月 21 07:17:25 192.168.136.128 python3[90403]: 2024-10-21 07:17:25 - Hello World

 配置HelloWorld.time文件,可以通过systemctl list-timers列出timer文件来查看一些格式,或则

通过man 5 systemd.timer 查看文件格式可以得到unit、install、timer是必要的

中文解释 systemd.timer 中文手册 [金步国] (jinbuguo.com)

 继续再/etc/systemd/system目录下编辑timer文件,相当于定时调用service服务

[Unit]
Description=Runs hellworld every hour

[Timer]
OnActiveSec=1m # 定时器生效后一分钟开始执行
Unit=HelloWorld.service # 启动的服务

[Install]
WantedBy=multi-user.target

timer中的各个参数配置,

  • OnActiveSec= 相对于该单元自身被启动的时间点; 
  • OnBootSec= 相对于机器被启动的时间点, 也就是内核开始运行的时间点; 
  • OnStartupSec= 相对于 systemd 被首次启动的时间点,也就是内核启动init进程的时间点;
  • OnUnitActiveSec= 相对于匹配单元最后一次被启动的时间点; 
  • OnUnitInactiveSec= 相对于匹配单元 最后一次被停止的时间点;

启动timer服务,并检查服务状态

waiting代表等待任务触发

running代表正在之执行

elapsed代表已经执行完毕

[root@192 system]# systemctl status HelloWorld.timer
● HelloWorld.timer - Runs hellworld every hour
   Loaded: loaded (/etc/systemd/system/HelloWorld.timer; disabled; vendor preset: disabled)
   Active: active (waiting) since Mon 2024-10-21 23:27:13 CST; 54s ago
  Trigger: Mon 2024-10-21 23:28:13 CST; 5s left

10月 21 23:27:13 192.168.136.128 systemd[1]: Stopped Runs hellworld every hour.
10月 21 23:27:13 192.168.136.128 systemd[1]: Stopping Runs hellworld every hour.
10月 21 23:27:13 192.168.136.128 systemd[1]: Started Runs hellworld every hour.
[root@192 system]# systemctl status HelloWorld.timer
● HelloWorld.timer - Runs hellworld every hour
   Loaded: loaded (/etc/systemd/system/HelloWorld.timer; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2024-10-21 23:27:13 CST; 1min 9s ago
  Trigger: n/a

10月 21 23:27:13 192.168.136.128 systemd[1]: Stopped Runs hellworld every hour.
10月 21 23:27:13 192.168.136.128 systemd[1]: Stopping Runs hellworld every hour.
10月 21 23:27:13 192.168.136.128 systemd[1]: Started Runs hellworld every hour.
[root@192 system]# systemctl status HelloWorld.timer
● HelloWorld.timer - Runs hellworld every hour
   Loaded: loaded (/etc/systemd/system/HelloWorld.timer; disabled; vendor preset: disabled)
   Active: active (elapsed) since Mon 2024-10-21 23:27:13 CST; 1min 19s ago
  Trigger: n/a

 查看输出的日志journalctl -u HelloWorld.timer,脚本中的文件已经输出

10月 21 23:28:22 192.168.136.128 systemd[1]: Started Hello World.
10月 21 23:28:22 192.168.136.128 python3[4407]: 2024-10-21 23:28:22 - Hello World

 参考:

Systemd 定时器教程 - 阮一峰的网络日志 (ruanyifeng.com)

systemd.timer 中文手册 [金步国] (jinbuguo.com)

Linux Systemd完全入门 | 一个视频搞懂systemd的使用_哔哩哔哩_bilibili