CentOS7中自启动脚本配置后重启服务未启动问题排查
嘿,这种手动执行脚本一切正常,但开机自启动就掉链子的情况,在CentOS7里太常见了——核心问题基本都绕不开环境变量、路径、权限或者启动时机这几个点,咱们逐个拆解:
1. 环境变量不完整,找不到npm
手动登录时,你的shell会加载.bashrc/.bash_profile这类配置文件,里面包含了node/npm的路径(比如用nvm安装的话)。但开机自启动的进程(比如rc.local或者systemd)是在极简环境下运行的,默认PATH里根本没有你用户目录下的node二进制文件路径,自然找不到npm。
解决办法:
- 把脚本里的
npm换成绝对路径,比如你可以用which npm手动查到路径(比如/home/your-user/.nvm/versions/node/v16.18.0/bin/npm),替换后命令变成:cd /source/finance-calendar && nohup /home/your-user/.nvm/versions/node/v16.18.0/bin/npm run server:prod >/dev/null 2>&1 & - 或者在脚本开头手动加载用户的环境变量:
source /home/your-user/.bashrc cd /source/finance-calendar && nohup npm run server:prod >/dev/null 2>&1 &
2. 工作目录切换失败,脚本执行上下文不对
虽然你加了cd /source/finance-calendar,但如果开机自启动进程的初始目录没有权限,或者cd命令执行失败(比如目录临时挂载失败),后续的npm命令就会在错误的目录下执行,自然启动失败。而且默认情况下,cd失败后脚本会继续执行,你根本不知道出问题了。
解决办法:
在cd命令后加上失败判断,确保切换目录成功才继续:
cd /source/finance-calendar || exit 1 nohup npm run server:prod >/dev/null 2>&1 &
3. 权限不匹配:用root执行但依赖用户环境
手动执行是用你的普通用户,但开机自启动默认以root身份运行。root的环境变量和普通用户完全不同,而且可能没有访问/source/finance-calendar目录的权限,或者root下根本没安装npm/相关依赖。
解决办法:
- 如果用rc.local,切换到你的普通用户执行命令:
su - your-user -c 'cd /source/finance-calendar && nohup npm run server:prod >/dev/null 2>&1 &' - 更推荐用systemd服务,明确指定执行用户:写一个
/etc/systemd/system/finance-calendar.service文件:
然后执行以下命令启用服务:[Unit] Description=Finance Calendar Production Service After=network.target # 如果服务依赖网络,确保网络就绪后启动 [Service] User=your-user # 替换成你的普通用户名 WorkingDirectory=/source/finance-calendar ExecStart=/path/to/your/npm run server:prod # 这里用npm的绝对路径 Restart=always # 服务崩溃时自动重启 [Install] WantedBy=multi-user.targetsystemctl daemon-reload systemctl enable finance-calendar.service
4. 错误日志被吞,根本不知道哪里错了
你把所有输出都重定向到/dev/null了!手动执行时如果有错误你能看到,但开机自启动的错误信息直接被丢掉,连排查线索都没有。这是最容易忽略的坑。
解决办法:
暂时把输出重定向到日志文件,方便排查:
cd /source/finance-calendar && nohup npm run server:prod >/var/log/finance-calendar.log 2>&1 &
重启系统后,查看日志文件:
cat /var/log/finance-calendar.log
日志里会明确告诉你是npm找不到、依赖缺失还是配置文件错误。
5. rc.local默认禁用(如果用的是rc.local)
CentOS7默认是关闭rc.local服务的,如果你直接把脚本加到/etc/rc.d/rc.local里,开机时根本不会执行。
解决办法:
先启用rc.local并给它加执行权限:
systemctl enable rc-local.service chmod +x /etc/rc.d/rc.local
内容的提问来源于stack exchange,提问作者xuewen yu

