在 Mac 上跑长时间后台任务,合盖就丢了两小时数据
问题
我在 Mac 上跑一个要连续采好几天的后台任务,定时抓图写到磁盘。它得一直开着不能断,断了就得整段重来,很麻烦。
现象
跑了一天去查,发现中间有大概两个小时(下午 4 点多到快 7 点)一路数据全是空的——好几路采集在同一时刻一起停了,前后只差一两秒,整齐得不正常。
更迷惑的是:任务打的日志文件是 0 字节,用 tail 看什么都没有。乍一看还以为程序压根没在跑,或者崩了没写盘。
怎么解决
先排除是不是网络或者设备的问题。好几路同时断、时间又几乎一样,说明不是哪一路自己挂了,是本机整体被按了暂停。对着 Mac 的睡眠机制一查就明白了:
我原来启动任务用的是 caffeinate -i,这个参数只防”空闲睡眠”——就是电脑没人动的时候不去睡。但它防不住合盖睡眠(你把笔记本盖上了系统直接睡死)。我那台机器中间被合盖了,系统一睡,后台任务全冻住,盖子打开才继续,于是中间那两小时就空了。
改成 caffeinate -s -i 就好了:
caffeinate -s -i bash source/scripts/run_capture.sh
-s是系统级防睡,盖了盖也不睡(不过得插着电源才生效);- 启动前再确认接上电源、盖子打开。
改完后面几天跑下来,一路数据都是满的,没有再出现这种整段空缺。
至于日志 0 字节那个假象,原因是 Python 把 stdout 重定向到文件时默认用了块缓冲——攒够一块才写盘,不是实时写。所以程序其实在跑、数据也在落,只是日志还没刷出来。真要看任务还活着没,别 tail 日志,去看它写出的数据文件(比如最新一帧的时间戳、或者那个记录进度的 csv 末行),落后当前时间超过两分钟才算真卡了。
结论
- 在 Mac 上跑要连续好多天的后台任务,光
caffeinate -i不够,合盖照样睡死;用caffeinate -s -i+ 插电 + 开盖才稳。 - 日志文件 0 字节不一定是程序挂了,可能是块缓冲没刷盘;盯数据文件的实时变化比盯日志靠谱。