学习目标
✅ 掌握Python进程管理(对比Java的ProcessBuilder
)
✅ 熟练使用subprocess
模块执行系统命令
✅ 理解系统服务管理(Systemd vs Python服务化)
✅ 完成进程监控与自动重启实战
功能 | Java实现 | Python实现 |
---|---|---|
执行命令 | Runtime.getRuntime().exec() | subprocess.run() |
获取输出 | 读取InputStream | stdout=subprocess.PIPE |
异步执行 | Process.waitFor() | subprocess.Popen() |
代码对比:
// Java执行命令
Process proc = Runtime.getRuntime().exec("ls -l");
BufferedReader reader = new BufferedReader(
new InputStreamReader(proc.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
# Python执行命令
import subprocess
# 同步执行(推荐)
result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
print(result.stdout)
# 异步执行
proc = subprocess.Popen(["ping", "google.com"], stdout=subprocess.PIPE)
while proc.poll() is None:
print(proc.stdout.readline())
管道通信示例:
# 父进程发送数据到子进程
from multiprocessing import Pipe
parent_conn, child_conn = Pipe()
child_conn.send("Hello from child")
print(parent_conn.recv()) # 输出接收的数据
共享内存示例:
from multiprocessing import Value, Array
# 共享整型值
counter = Value('i', 0)
counter.value += 1
# 共享数组
arr = Array('d', [1.0, 2.0])
arr[0] = 3.14
操作 | Systemd命令 | Python实现 |
---|---|---|
启动服务 | systemctl start nginx | subprocess.run(["systemctl", "start", "nginx"]) |
守护进程化 | 配置文件[Service]段 | 使用daemon模块或第三方库 |
Python服务化示例:
import daemon
def run_as_service():
while True:
do_work()
# 转换为守护进程
with daemon.DaemonContext():
run_as_service()
import logging
from logging.handlers import RotatingFileHandler
# 配置日志(类似Log4j)
logging.basicConfig(
handlers=[RotatingFileHandler("app.log", maxBytes=1e6, backupCount=3)],
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s"
)
logging.info("Service started")
进程信息获取:
import psutil # 第三方库,需安装
def get_process_info(name):
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_info']):
if proc.info['name'] == name:
return {
'pid': proc.info['pid'],
'cpu': proc.info['cpu_percent'],
'memory': proc.info['memory_info'].rss / 1024 / 1024 # MB
}
return None
自动重启逻辑:
def restart_process(cmd):
subprocess.run(["pkill", "-f", cmd[0]])
return subprocess.Popen(cmd)
def monitor(process_name, cmd, max_cpu=90, max_mem=1024):
while True:
info = get_process_info(process_name)
if not info or info['cpu'] > max_cpu or info['memory'] > max_mem:
restart_process(cmd)
time.sleep(5)
使用方式:
monitor("nginx", ["nginx", "-g", "daemon off;"])
进程生命周期管理
subprocess
比Java更简洁,但需手动处理僵尸进程
proc = subprocess.Popen(...)
try:
proc.wait(timeout=10)
except subprocess.TimeoutExpired:
proc.terminate()
跨平台差异
import signal
signal.signal(signal.SIGTERM, handler) # Unix only
性能监控精度
ManagementFactory
提供JVM详细数据
psutil
获取系统级指标
实现服务健康检查API
from flask import Flask
app = Flask(__name__)
@app.route('/health')
def health():
return {"status": "OK", "pid": os.getpid()}
构建进程管理CLI工具
# 支持命令:python manager.py start|stop|status
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("action", choices=["start", "stop", "status"])
args = parser.parse_args()
容器化部署
# Dockerfile示例
FROM python:3.10
COPY monitor.py .
RUN pip install psutil
CMD ["python", "monitor.py"]
通过第七天的学习,您将掌握: 1️⃣ Python原生进程管理能力 2️⃣ 系统服务化关键技术点 3️⃣ 生产级进程监控方案 4️⃣ 与Java方案的优劣势对比
本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注。