Linux服务器运维这4件事,我全写成脚本让它定时跑

来源:互联网 时间:2026-10-07

服务器出问题的时间点,通常都很不友好:周五晚上、节假日、或者你刚躺下的那一刻。而它们的起因,往往又都是些小得不能再小的事——磁盘悄悄满了、日志文件涨到几个G、一张证书到期了没人发现。这些都不是突发事件,是长时间没人看才变成事故的。这些事有一个共同特征:它们平时看不出来,只有积累到一定程度才爆发。而爆发的时机不由你选,往往是流量高峰、或者你正在忙别的事情的时候。所以它们的处理方式不是等到出问题再说,而是提前把检查这件事固定下来。

人的注意力靠不住,但脚本不会忘。下面这4件事是我现在固定交给脚本去做的,每天跑一次,跑完只看结果。它们都不复杂,加起来不到二十行命令,难度不在于写,而在于想到要写。判断哪些事值得交给脚本,有个标准:频繁发生、判断规则明确、而且人容易忘。这三条同时满足的,基本都该自动化。反过来,需要临场判断的、偶尔才发生一次的,硬写成脚本反而是负担,因为脚本坏了你还得去修脚本。

先想清楚,哪几件事值得自动化

第一件是磁盘空间。这是最常见也最容易拖成事故的一项,等到写不进文件才处理,往往已经影响到服务。第二件是日志体积,日志涨得比你想的快,尤其是开了详细日志之后,一个不注意就能吃掉几十G。这两件都属于“平时没感觉、出事就很急”的类型。磁盘这件事还有个特点,它往往不是突然满的,而是一点点涨上去的。在你察觉之前,这条曲线可能已经涨了好几天。所以检查的价值在于把它变成可见的,让问题在变成事故之前先露个头。

第三件是证书到期。免费证书周期越来越短,靠记性去盯必然出错,而它过期之前不会有任何提示,直到访客看到一整页警告。第四件是服务存活,web服务、数据库、定时任务这些关键进程,需要一个例行检查来确认它们还在跑,而不是等你发现访问不了。证书的麻烦在于它的失败是静默的。到期之前一切正常,到期那一刻开始报错,而你往往是从访客的反馈里才知道。把剩余天数做成一个每天都能看到的数字,是成本最低的一层保险,几乎不需要维护。

把这几件串起来,脚本本身其实很短。核心就是几条只读命令,跑完把结果输出出来,需要判断的地方用命令的退出码来决定。放在定时任务里,每天跑一次,你只需要看结果里的异常行。这四件事还有一个共同点,它们的检查动作都是只读的。只读意味着两件事:一是脚本本身没有破坏性,出错了也不会造成损失;二是你可以随时手动跑一遍,和你平时敲的命令没有区别。先把只读的部分做扎实,有破坏性的动作再单独处理。

df -h | awk '$5+0 > 85 {print "disk warning:", $6, $5}'

du -sh /var/log/

find /var/log -type f -mtime +30 -name "*.log" -print

openssl x509 -in /etc/ssl/fullchain.pem -noout -checkend 2592000

systemctl is-active nginx

几条命令里有两点容易写错。一是find的时间参数,-mtime +30指的是30天以前修改的文件,也就是更旧的那些,不是30天以内;如果写成-mtime -30,方向就正好反了。二是openssl的checkend,后面跟的是秒数,它会在证书于指定时间内过期时返回非零,不过期则返回零,所以能直接当成判断条件来用,2592000就是30天。还有一个细节值得注意:把命令的输出直接拿来做判断的时候,要小心它同时输出错误信息和正常信息。稳妥的做法是把标准输出和错误输出分开处理,需要屏蔽的地方显式屏蔽掉,免得某个情况下多出来的一行被当成异常。

还有一点经验:删日志这类动作,先别急着上-delete。find的-delete会连带打开-depth,而且如果整条命令写错顺序,后果是删掉一大片。稳妥的做法是先只做-print,看一眼列出来的东西是不是你以为的那些,确认无误再把动作换掉。多花一分钟,能避免一次事故。日志清理还有一个容易被忽略的地方:不是所有日志都该按同一个天数删。访问日志和使用日志的价值不一样,错删了想追溯的时候就没有了。比较稳的做法是先按类型分组,给每组设一个自己的保留天数,而不是一条命令砍平。

脚本写好了,接下来是让它按时跑。用cron是最熟悉的方式,一条记录就够;如果想看每次执行的记录、也方便排错,可以用systemd的定时器配一个同名的服务单元。两种都可以,区别主要在日志和排查的顺手程度上。真正的关键不在用哪个,而在于你把结果留在哪里——跑到没人看的地方,等于没跑。定时还有一个坑:脚本依赖的工作目录和环境变量,在手动执行时是对的,放到定时任务里却可能不一样。原因是定时任务拿到的环境和你在命令行里登录时拿到的环境并不相同。所以脚本里凡是涉及路径和变量,最好都写绝对值和显式声明,别依赖运行时环境。

所以最后一步是把输出变成你能看见的东西:让脚本把异常行发到邮箱,或者写进一个专门的日志文件,每天早上扫一眼。自动化的价值不在于省下那几条命令,而在于它把“你记不记得”这件事从流程里拿掉了。服务器不会提前打招呼,它只在你最不方便的时候,把攒了很久的问题一次还给你。通知也要挑地方。发给一个你每天都会打开的邮箱或者群,发到你不看的地方等于没发。另外别让所有的检查结果都推给你——只有异常才通知,正常就安静待着。天天收到一切正常,很快你就不会再点开它了。

相关文章

标签:

A5创业网 版权所有