You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOS M1上SoilTempMonitor.py进程意外重启且无法终止的问题

问题描述
  • 环境:Mac mini M1(系统26.1.3),运行SoilTempMonitor.py脚本,通过本地MQTT代理接收ESP32温度计数据并写入MySQL
  • 故障:配置.plist实现开机自启后,数据库出现重复条目,执行pgrep -fl SoilTemp查到两个SoilTempMonitor.py进程
  • 异常:将.plist移出~/Library/LaunchAgents并重启Mac后,仍有一个进程运行,手动杀死后会自动以新PID重启
原因分析
  1. 重复进程核心原因:脚本被两个独立的Launchd配置管理——一个是你放在用户目录的.plist,另一个可能是之前测试时误安装到系统级目录(/Library/LaunchAgents或/Library/LaunchDaemons),或是曾用launchctl手动加载过配置但未彻底卸载。
  2. 自动重启触发逻辑:Launchd配置里KeepAlive设为true时,会持续监控进程状态,一旦进程退出就自动重启。哪怕你删除了.plist,如果没正确卸载对应的Launchd服务规则,Launchd依然会执行重启逻辑。
  3. 额外问题:你提供的.plist中,脚本路径末尾多了空格和点(/Users/peterwiley/Documents/python/SoilTempMonitor.py. ),这会导致Launchd无法正确识别脚本路径,可能触发异常重启,但当前运行的进程应该来自另一个正确的配置。
解决步骤

1. 排查所有关联的Launchd配置文件

执行命令搜索所有和SoilTemp相关的.plist:

sudo find /Library/LaunchAgents /Library/LaunchDaemons ~/Library/LaunchAgents -name "*SoilTemp*"

如果找到除你自己之外的其他配置文件,先备份再删除。

2. 彻底卸载Launchd服务规则

不管是否找到配置文件,直接通过Label名称卸载服务:

# 如果你的plist还在用户目录,先执行卸载
launchctl unload -w ~/Library/LaunchAgents/prw.SoilTempMonitor.plist
# 直接通过Label移除Launchd中的服务规则
launchctl remove SoilTempMonitor
# 如果是系统级配置,需要加sudo
sudo launchctl remove SoilTempMonitor

3. 强制终止所有相关进程

杀死所有SoilTempMonitor.py进程:

pkill -f SoilTempMonitor.py

再检查是否有残留:

pgrep -fl SoilTemp

如果还有进程,用kill -9 <PID>(替换<PID>为实际进程ID)强制终止。

4. 修复并重新配置自启(可选)

如果还要继续用开机自启,先修正.plist的脚本路径错误:把/Users/peterwiley/Documents/python/SoilTempMonitor.py. 改成/Users/peterwiley/Documents/python/SoilTempMonitor.py(去掉末尾的空格和点),然后重新加载配置:

launchctl load -w ~/Library/LaunchAgents/prw.SoilTempMonitor.plist
附:原prw.SoilTempMonitor.plist内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"     "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>SoilTempMonitor</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/python3</string>
        <string>/Users/peterwiley/Documents/python/SoilTempMonitor.py. </string>
    </array>
    <key>StandardOutPath</key>
    <string>/var/log/SoilTempMonitor.stdout.log</string>
    <key>StandardErrorPath</key>
        <string>/var/log/SoilTempMonitor.error.log</string>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

内容的提问来源于stack exchange,提问作者Peter Wiley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 07:24:52