如何通过脚本运行Node.js应用?脚本执行报错求助
解决init.d脚本运行Node.js应用找不到命令的问题
咱们一步步拆解你碰到的问题,主要是脚本语法错误和sudo执行时的环境/路径问题:
1. 先修正脚本的语法问题
你原来的脚本把所有命令挤在一行且没做分隔,导致shell把sudo node...全当成了echo的输出参数,根本没真正执行Node命令。先给脚本加上正确的shebang和命令分隔:
#!/bin/bash echo "Starting node application" # 注意:你已经用sudo执行整个脚本了,这里不需要再嵌套sudo /home/pi/.nvm/versions/node/v8.11.3/bin/node /home/pi/PPBot/bot.js exit 0
重点提醒:你之前写的路径
v.8.11.3多了个点,正确路径应该是v8.11.3,这个拼写错误直接会导致找不到命令!
2. 为什么直接命令行能跑,脚本不行?
你用NVM安装的Node是属于pi用户的,当你用sudo执行脚本时,会切换到root用户环境——而root并没有加载NVM的环境变量。哪怕你写了绝对路径,拼写错误或者权限问题(不过root有权限访问pi用户的目录)也会失败。另外,你已经用sudo启动整个脚本了,脚本里再写sudo属于多余的二次权限切换,反而容易出问题。
3. 验证与优化步骤
- 先手动验证绝对路径是否正确:
如果能正常输出版本号,说明路径没问题。sudo /home/pi/.nvm/versions/node/v8.11.3/bin/node -v - 给脚本添加执行权限:
sudo chmod +x /etc/init.d/botscript - 再次执行脚本尝试启动:
sudo /etc/init.d/botscript
如果想把这个脚本做成标准的init.d服务(支持start/stop),可以参考这个模板:
#!/bin/bash case "$1" in start) echo "Starting PPBot..." /home/pi/.nvm/versions/node/v8.11.3/bin/node /home/pi/PPBot/bot.js & echo $! > /var/run/ppbot.pid ;; stop) echo "Stopping PPBot..." kill $(cat /var/run/ppbot.pid) rm /var/run/ppbot.pid ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0
之后就可以用sudo /etc/init.d/botscript start或stop来管理服务了。
内容的提问来源于stack exchange,提问作者K. Tilman
相关产品推荐
相关产品推荐

