更新时间:2025-05-28 09:20点击:8
哎,你也在为服务器开机自启动服务抓狂吧?我徒弟上周写了个启动脚本,结果把数据库整崩了三次。这玩意儿就像汽车的自动点火装置,整不好可是要趴窝的。今儿咱们就用炒菜的比喻,把启动脚本这点事唠明白。
举个活生生的例子:去年杭州某公司运维小哥写错一个符号,导致200台服务器集体罢工半小时。启动脚本其实就是系统开机的待办事项清单,告诉Linux先穿袜子再穿鞋。这里头讲究个顺序,比如得先启动网络服务才能挂载远程存储。
搞清三大核心概念:
《2023年Linux运维报告》显示,78%的启动故障是因为脚本权限没设对。下面这个对比表可得存好了:
特性 | SysVinit脚本 | systemd服务单元 |
---|---|---|
文件位置 | /etc/init.d | /etc/systemd/system |
语法格式 | Shell脚本 | INI配置文件 |
日志查看 | 要自己重定向输出 | journalctl自动记录 |
开机自启 | chkconfig命令 | systemctl enable |
错误处理 | 全靠return code | 自动重启机制 |
上周帮创业公司写的MySQL启动脚本,拿这个当模板准没错:
bash复制#!/bin/bash # 千万别用root直接跑,出事了跑都跑不掉 LOCK_FILE=/var/run/mysqld.pid case \"$1\" in start) if [ -f $LOCK_FILE ]; then echo \"MySQL已经在跑了,别瞎折腾\" exit 1 fi /usr/bin/mysqld_safe --datadir=/var/lib/mysql & ;; stop) kill $(cat $LOCK_FILE) ;; restart) $0 stop sleep 5 $0 start ;; *) echo \"用法:$0 {start|stop|restart}\" exit 2 esac
重点来了❗️测试时一定要加-x参数,能看到每步执行情况:bash -x myscript.sh start
上海某运维团队的血泪教训:
which mysql
动态获取)timeout 30s your_command
)有个冷知识:Systemd的服务单元文件里,如果设置Restart=on-failure
,脚本执行失败会自动重试。之前见人用这个特性做服务探活,比第三方监控工具还灵敏。
北京有个老司机教我的绝活:用strace -f bash script.sh
跟踪系统调用。上次有个脚本卡在文件锁上,就是用这个方法发现是NFS挂载延迟导致的。
记住这三板斧:
echo $?
看上条命令的退出码set -e
让脚本遇错就停trap \'错误处理函数\' ERR
搞个应急预案上周处理过最奇葩的案例:脚本在CentOS上跑得好好的,搬到Ubuntu就挂。最后发现是/bin/sh
指向的dash和bash不兼容,改成#!/bin/bash
就药到病除。
2023年Linux基金会报告指出,62%的企业开始用Ansible管理启动脚本。但有个反常识现象——金融公司反而更喜欢手动维护,为的是审计时能说清每行代码的作用。
最近发现的宝藏工具:用systemd-analyze blame
看每个服务的启动耗时。帮电商公司优化后,服务器启动时间从1分半压到40秒,相当于每天多出两分钟的交易时间。
说句掏心窝的话:别死磕Shell脚本,现在Kubernetes的Init容器设计更香。但你要是能把systemd单元文件玩出花,出去面试绝对能唬住人。你们还遇到过哪些邪门的启动问题?评论区开开眼!最后提醒下:改脚本前务必备份/etc
目录,别问我怎么知道的...