Ubuntu 16.04.3 LTS init.d启动脚本偶发重复执行问题排查咨询
这种偶发的脚本重复启动确实挺闹心的,咱们一步步来拆解排查:
先检查脚本自身的启动逻辑
很多时候重复执行是因为脚本的start函数没做进程存在性校验。比如你的脚本里有没有在启动时创建PID文件,或者检查目标进程是否已经在运行?如果没有,那系统启动过程中可能因为某些触发条件(比如依赖服务重启)导致脚本被再次调用。建议在脚本的start分支开头加上:PIDFILE="/var/run/TEST.pid" if [ -f "$PIDFILE" ] && kill -0 $(cat "$PIDFILE") 2>/dev/null; then echo "TEST is already running" >> /var/log/test_script.log exit 0 fi同时每次启动成功后把当前PID写入PID文件,这样能避免重复启动。
检查所有运行级别的启动链接
你只创建了rc2.d/S99TEST,但Ubuntu默认运行级别是2,不过也有可能其他运行级别(比如3、4、5)也存在同名链接?用这条命令检查所有rc目录:ls -l /etc/rc*.d/*TEST如果发现其他运行级别也有S开头的链接,那系统切换运行级别时就会再次执行脚本。
排查Systemd/Upstart的干扰
Ubuntu 16.04是Systemd和Upstart的过渡版本,有可能你的脚本同时被init.d和另一个启动系统调用了:- 检查有没有Systemd的service文件:
systemctl list-unit-files | grep TEST,如果存在同名的.service文件,可能会和init.d脚本重复启动; - 检查Upstart的配置:
ls /etc/init/*TEST.conf,如果有对应的Upstart配置,也可能导致重复触发。
- 检查有没有Systemd的service文件:
给脚本加详细日志,追踪启动来源
既然系统日志里没记录,那咱们自己在脚本里加日志。在脚本最开头(或者start函数的第一行)加上:LOGFILE="/var/log/test_script.log" echo "[$(date '+%Y-%m-%d %H:%M:%S')] TEST script triggered | User: $USER | PID: $$ | PPID: $PPID | Call path: $0 $@" >> "$LOGFILE"这里的
PPID(父进程ID)很关键,你可以通过它反查是谁启动了脚本:比如父进程是1(init/systemd),还是其他服务进程?如果两次启动的PPID不同,就能定位到不同的启动源。深挖系统启动日志
试试这些日志排查命令:- 如果是Systemd处理init.d脚本:
journalctl -u rc-local.service | grep TEST; - 查看Upstart日志:
cat /var/log/upstart/* | grep TEST; - 查看内核启动日志:
dmesg | grep TEST; - 甚至可以检查
/var/log/syslog的完整内容,用grep -i "test\|init.d" /var/log/syslog来过滤。
- 如果是Systemd处理init.d脚本:
检查其他服务的依赖或调用
有没有其他init.d脚本在启动过程中调用了你的TEST脚本?比如某个服务的启动脚本里执行了service TEST start或者直接调用/etc/init.d/TEST?用这条命令搜索:grep -r "TEST" /etc/init.d/手动测试脚本行为
手动执行/etc/init.d/TEST start多次,看看会不会出现重复启动的情况。如果手动执行也会触发两次,那问题肯定出在脚本自身的逻辑里;如果手动正常,那就是系统启动流程中的特殊场景导致的。
内容的提问来源于stack exchange,提问作者logidelic

