定时喝水与家务提醒守护进程:用 Python systemd 守护身体电量

作为一名全职居家远程办公的开发者,最容易出现的生理透支现象莫过于"灵魂在代码里飞翔,身体在椅子上枯萎"。
写起一段高难度的算法逻辑或者排查一个线上死锁,一坐就是整整四个小时不动弹。杯子里的水凉透了没喝一口,膀胱憋得发痛,等好不容易回过神来站起身,眼前发黑、腰部像被铁板焊死一样僵硬。
手机上的各种打卡提醒 App 往往很快就会被麻木地随手划掉,因为它们缺乏与真实环境状态的物理联动。
为了给自己和家里父母建立一个不可忽视但又毫不刺眼的生理守护网,我用 Python 编写了一个基于 Linux systemd 守护进程 + 本地人体传感器感应 + 物理微提醒 的智能起坐与喝水服务。
flowchart TD
Timer[45分钟专注计时器] –> StateCheck{人体红外/键盘敲击活跃检测}
StateCheck –>|连续久坐 > 45分钟| TriggerReminder[触发物理微提醒]
TriggerReminder –> Action1[智能插座联动: 烧水壶自动启动保温]
TriggerReminder –> Action2[屏幕角落弹出一行温润轻提示]
TriggerReminder –> Action3[书房背景灯色温从 4000K 渐变至 2800K 暖黄]
TriggerReminder –> SitStand[升降桌自动上升至站立模式高度]
物理联动的四大守护机制
- 到达 45 分钟时,书房的背景补光灯不会突然熄灭,而是在 2 分钟内缓慢从明亮冷白渐变至柔和暖黄,在大脑视觉潜意识中植入"该休息一下眼睛"的信号。
- 通过 Zigbee 接入升降桌控制总线,久坐超标后自动将桌子升起 30cm,迫使身体从坐姿转为站姿继续完成手头剩余的几行代码。
- 监测到室内干燥或气温过高时,向客厅音箱发送轻量通知,提醒老妈老爸喝温开水。
基于 Python 的 Systemd 守护进程源码
import time
import subprocess
import os
import signal
import sys
from datetime import datetime
class BodyBatteryGuard:
def __init__(self, sit_limit_minutes: int = 45, water_interval_minutes: int = 60):
self.sit_limit_sec = sit_limit_minutes * 60
self.water_interval_sec = water_interval_minutes * 60
self.last_stand_time = time.time()
self.last_water_time = time.time()
self.running = True
signal.signal(signal.SIGTERM, self._handle_exit)
signal.signal(signal.SIGINT, self._handle_exit)
def _handle_exit(self, signum, frame):
print(f"[Daemon] 接收到退出信号 {signum},正在安全终止…")
self.running = False
def check_and_notify(self):
now = time.time()
# 1. 检查久坐超限
if now – self.last_stand_time > self.sit_limit_sec:
print(f"[{datetime.now().strftime('%H:%M:%S')}] 🚨 检测到连续久坐超 45 分钟,触发站立提醒与升降桌联动!")
self._trigger_stand_up_event()
self.last_stand_time = now # 重置计时
# 2. 检查喝水周期
if now – self.last_water_time > self.water_interval_sec:
print(f"[{datetime.now().strftime('%H:%M:%S')}] 💧 触发温水补给提醒")
self._trigger_water_event()
self.last_water_time = now
def _trigger_stand_up_event(self):
# 触发桌面通知与智能家居灯光联动
try:
subprocess.run([
"notify-send",
"🌿 站起来活动一下吧",
"已连续专注 45 分钟。伸个懒腰,喝口温水,看一眼窗外的绿植。",
"-u", "normal"
], check=False)
except Exception:
pass
def _trigger_water_event(self):
# 联动烧水壶保温或音箱轻播报
pass
def run_loop(self):
print("[Daemon] 身体电量与健康守护进程已常驻运行…")
while self.running:
self.check_and_notify()
time.sleep(10) # 10 秒轮询一次
if __name__ == "__main__":
guard = BodyBatteryGuard()
guard.run_loop()
Systemd 服务单元配置(7×24 小时常驻守护)
将服务注册为 Linux 用户级 systemd 单元文件 ~/.config/systemd/user/body_guard.service:
[Unit]
Description=Developer Body Battery Health Daemon
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/scripts/body_battery_guard.py
Restart=always
RestartSec=10
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=default.target
启用并启动守护进程:
systemctl –user daemon-reload
systemctl –user enable –now body_guard.service
爱护身体是长期主义的第一生产力
在追求技术卓越的道路上,很多年轻人习惯用透支健康去换取短期的进度条。
但代码是一场长达几十年的马拉松。用严谨的后台守护进程为自己筑起一道健康防线,在每一声清脆的水滴提示音中舒展筋骨、端起温水,才能在这片代码的旷野上走得从容而长远。





