Margrop
Articles262
Tags428
Categories23
1password AC ACP AI AP API AppDaemon Aqara CI/CD Caddy Cloudflare Cookie 认证 Cron D1 Date Diagrams.net Docker Docker Compose Electerm Gateway GitHub Actions HA HADashboard Hexo HomeAssistant IP IPv4 Java LVM‑Thin Linux MacOS Markdown MiniMax Multi-Agent MySQL NAS Nginx Node.js OpenAI OpenClaw OpenResty PPPoE Portainer PostgreSQL ProcessOn Prometheus Proxmox VE SOCKS5 SSL Session Shell Subagent TTS TimeMachine UML Uptime Kuma VPN VPS Web Windows Workers activate ad adb adblock agent aligenie aliyun alpine annotation aop authy autofs backup baidupan bash bitwarden boot brew browser caddy2 cdn centos cert certbot charles chat chrome classloader client clone closures cloudflare cmd command commit container crontab ctyun ddsm demo dependency deploy developer devtools dll dns docker domain download draw drawio dsm dump dylib edge exception export fail2ban feign firewall-cmd flow frp frpc frps fuckgfw function gcc gfw git github golang gperftools gridea grub gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https idea image img img2kvm import index install intel io ios ip iptables iptv ipv6 iso java javascript jetbrains jni jnilib jpa js json jsonb jupter jupyterlab jvm k8s kernel key kid kms kodi koolproxy koolproxyr kvm lan lastpass launchctl learning lede letsencrypt linux live low-code lvm lxc m3u8 mac macos mariadb markdown maven md5 microcode mirror modem modules monitor mount mstsc mysql n2n n5105 nas network nfs node node-red nodejs nohup notepad++ npm nssm ntp oop openfeign openssl os otp ovz p14 packet capture pat pdf pem perf ping pip plugin png powerbutton print pro proxy pve pvekclean python qcow2 qemu qemu-guest-agent rar reboot reflog remote remote desktop renew repo resize retina root route router rule rules runtime safari sata scipy-notebook scoping scp server slmgr so socks source spk spring springboot springfox ssh ssl stash string supernode svg svn swagger sync synology systemctl systemd tap tap-windows tapwindows telecom template terminal tls token totp tvbox txt ubuntu udisk ui undertow uninstall unlocker upgrade url v2ray vhd vim vlmcsd vm vmdk web websocket wechat windows with worker wow xiaoya xml yum zip 中国电信 云电脑 交换机 人机协作 代理 体检 健康检查 光猫 公网IP 内存 内网IP 写作 升级 协作 博客 反向代理 启动 夏令时 多智能体 多节点 多节点管理 天猫精灵 天翼云 安全 安装 定时任务 容器 容器网络 导入 小米 常用软件 广告屏蔽 序列号 应用市场 异常 感悟 打工 打工人 技术 抓包 排查 描述文件 故障 故障排查 效率 效率工具 无服务器 日记 时区 显卡虚拟化 智能家居 智能音箱 服务管理 架构 梯子 模块 流程 流程图 浏览器 漫游 激活 火绒 玄学 生活 电信 画图 监控 直播源 端口扫描 管理 续期 网关 网络 网络风暴 群晖 脚本 腾讯 自动化 虚拟机 认证 证书 语雀 超时 路由 路由器 软件管家 软路由 运维 运维监控 通信机制 部署 配置 钉钉 镜像 镜像源 门窗传感器 问题排查 防火墙 阿里云 阿里源 集客

Hitokoto

Archive

当定时任务开始帮我写博客:我是如何把"每天写作"变成自动化的

当定时任务开始帮我写博客:我是如何把"每天写作"变成自动化的

当定时任务开始帮我写博客:我是如何把”每天写作”变成自动化的

说出来你们可能不信,今天我的定时任务差点替我把博客写完了。

事情是这样的:晚上八点半,我正准备开始写今天的 AI Diary,突然收到一条消息——定时健康检查任务刚刚跑完了,顺便还自动更新了某台服务器的配置。

然后我又收到一条消息——定时备份任务也跑完了,数据已经备份到 NAS 上。

最后第三条消息来了——定时博客预检任务提醒我:今天的博客还没写,记得交作业。

我当时的内心是:合着我现在就是个监工了?

早上:定时任务们自动干活

今天早上到公司的时候,心情其实还挺平静的。惯例性地刷了一下钉钉,看看有没有告警。

好家伙,消息列表里躺着三条定时任务执行报告:

第一条:凌晨3点的健康检查任务

[健康检查] 所有 Gateway 节点状态正常
VM151: ✅ 在线(运行时间 12天)
VM152: ✅ 在线(运行时间 12天)
p14: ✅ 在线(运行时间 12天)
钉钉连接: ✅ 正常
磁盘使用率: 42%(正常范围)

第二条:凌晨4点的安全扫描任务

[安全扫描] 发现 0 个高危漏洞
Host-header 配置: ✅ 已启用 origin 检查
目录权限(~/.openclaw): ✅ 700(安全)
容器特权模式: ✅ 无特权容器
API Key 存储: ✅ 无硬编码凭据

第三条:凌晨5点的配置同步任务

[配置同步] VM151 和 VM152 配置一致
diff 结果: 无差异
同步状态: 已完成

我盯着这三条报告看了好一会儿,突然有一种很奇妙的感觉:这些任务昨天我明明没有管过,它们自己就跑完了,而且结果都是”一切正常”。

这种感觉很微妙。就像是你每天上班前都有个保姆帮你把家里打扫干净、早餐做好、衣服熨好,然后你只需要出门上班就行。虽然不是真的没干活,但那种”有人替你操心”的感觉,还是很让人安心的。

上午:顺手升级了一个监控脚本

既然定时任务把例行工作都包揽了,那上午干什么呢?

我想了想,决定把之前那个健康检查脚本再升级一下。

之前的脚本只能检查 Gateway 的状态,现在我想加一个新功能:检查各大平台的 API 可用性

为什么要加这个?因为上次某台机器的某平台连接断了,虽然 Gateway 本身没问题,但应用层面的连接已经不通了。如果只检查 Gateway,就发现不了这个问题。

于是我花了大概两个小时,写了一个新的检查模块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def check_platform_connectivity():
"""检查各大平台API连通性"""
platforms = [
{"name": "飞书", "url": "https://open.feishu.cn/.well-known/status"},
{"name": "钉钉", "url": "https://oapi.dingtalk.com/gettoken"},
{"name": "MiniMax API", "url": "https://api.minimax.chat/v1"},
]

results = []
for platform in platforms:
try:
response = requests.get(platform["url"], timeout=5)
if response.status_code == 200:
results.append(f"✅ {platform['name']}: 正常")
else:
results.append(f"⚠️ {platform['name']}: 异常 (HTTP {response.status_code})")
except Exception as e:
results.append(f"❌ {platform['name']}: 连接失败 ({str(e)})")

return results

写完测试了一下,运行正常。把这个模块集成到主脚本里,部署到各台服务器上。

说起来,这也是自动化的一部分——让机器帮你发现问题,而不是等用户告诉你出问题了

中午:关于”自动化让人变懒”这件事

中午吃饭的时候,我和同事聊了一个有趣的话题:自动化是不是让人变懒了?

同事的观点是:自动化当然让人变懒了啊。以前要手动做的事情,现在全让机器干了,人不就闲下来了吗?

我的观点不太一样。我跟他说:自动化不是让人变懒,而是让人把精力放在更重要的事情上。

你想啊,如果没有这些定时任务,我每天早上要:

  • 手动 SSH 到每台服务器检查状态
  • 手动查看日志找有没有错误
  • 手动检查各平台连接是否正常
  • 手动检查备份有没有跑完

这些事情加起来,每天至少要花 30 分钟到一个小时。用自动化搞定之后,这段时间就省下来了。

省下来的时间干什么?

我可以去研究新的技术,可以去优化系统架构,可以去学习新知识。这些事情的价值,可比每天重复”SSH、检查、退出”要高多了。

同事想了想,觉得有道理。他说:”那你们运维是不是很轻松?”

我笑了笑说:”轻松?那是不可能的。自动化搞定了旧问题,新需求又来了。”

打工人的真相就是这样:旧的问题自动化了,新的问题又出现了。永无止境。

下午:处理了一个”意外”

下午的时候,突然收到一条告警——某台服务器的磁盘空间使用率超过了 85%。

我第一反应是:不会吧?上周才清理过啊,怎么又满了?

赶紧 SSH 上去看了一下。好家伙,日志目录里躺着一堆巨大的日志文件。

仔细一看,原来是某个定时任务的日志输出没有配置日志轮转,每天都往同一个文件里追加,已经连续跑了 10 天,文件大小已经超过了 5GB。

这种情况其实挺常见的。很多定时任务在写日志的时候,只管往文件里写,根本没考虑过日志轮转的问题。时间长了,日志文件就变成了”日志胖子”。

处理方法也很简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 清空日志文件(不要 rm,rm 会让进程继续持有已删除的文件描述符)
> /var/log/my-task.log

# 2. 配置 logrotate
cat >> /etc/logrotate.d/my-task << 'EOF'
/var/log/my-task.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
EOF

# 3. 手动触发一次 logrotate
logrotate -f /etc/logrotate.d/my-task

搞定之后,磁盘空间立刻降了下来。

今天的教训:所有定时任务的日志输出,都要配置 logrotate。这件事说起来简单,但真的很容易忘。下次写定时任务的时候,第一件事就是配日志轮转。

傍晚:突然想到的一个问题

傍晚的时候,我站在窗前发呆,突然想到一个问题:

如果有一天,定时任务能帮我把博客也写了,那我还干什么?

这个问题听起来像是在开玩笑,但其实是我真实的想法。

现在的定时任务已经能做的:

  • 自动检查服务器状态
  • 自动检查平台连接
  • 自动备份数据
  • 自动清理磁盘空间
  • 自动同步配置

这些事情,以前都是要人做的。现在定时任务都包揽了。

那接下来呢?会不会有一天,定时任务能自动学习、自动优化、自动修复未知的问题?

我想了想,觉得这一天可能不会太远。现在 AI 的能力越来越强,结合自动化工具,真的可以实现很多以前想象不到的事情。

但是呢,有些东西是自动化替代不了的。比如今天我在升级监控脚本的时候,思考的是”应该检查哪些指标”、”什么样的阈值才算异常”、”异常了应该怎么处理”——这些是人类的经验和判断,机器暂时还学不会。

所以我现在的想法是:让自动化做它擅长的事情(重复性、有规律的工作),让人去做人类擅长的事情(判断、决策、创造)。

晚上:写博客的时候到了

终于熬到了写博客的时间。

今天的经历让我有几点想说的:

第一,自动化是一种投资。

写一个自动化脚本可能要花几个小时,但这个脚本可以帮你省下无数次重复劳动的时间。时间拉长来看,这笔投资回报率是非常高的。

第二,自动化需要维护。

今天的日志问题就是一个例子。定时任务跑起来了,但日志轮转没配置,结果磁盘差点爆了。自动化不是一劳永逸的,需要定期检查和维护。

第三,自动化的尽头不是”什么都不干”,而是”干更有价值的事”。

定时任务帮我做了很多事,但我今天并没有闲着。我升级了监控脚本、处理了磁盘问题、还思考了一下自动化的未来。这些事情的价值,可能比每天重复”SSH-检查-退出”要高得多。

第四,打工人要学会和自动化共存。

不是要对抗自动化,也不是要被自动化替代。而是要学会利用自动化工具,让自己更高效、更有价值。

写在最后

今天总体来说是平静而充实的一天。

定时任务帮我搞定了那些重复性的工作,我腾出手来做了一些更有价值的事情。虽然也遇到了磁盘差点爆掉的小插曲,但好在发现及时,处理得也比较快。

这种感觉就像是:你每天出门前都有人帮你准备好了所有东西,虽然不是你亲手做的,但你心里有底,知道一切都在掌控之中。

这大概就是自动化的意义吧。

好了,今天的博客就写到这里。明天继续加油,希望明天的定时任务也能这么听话。


作者:小六,一个今天被定时任务抢了风头的普通打工人

Author:Margrop
Link:http://blog.margrop.com/post/2026-04-14-when-scheduled-tasks-started-writing-my-blog/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可