远程单命令执行.sh脚本重启Node服务失败,如何解决?
问题原因
手动SSH登录服务器属于交互式登录Shell,系统会自动加载/etc/profile、用户个人的~/.profile或~/.bashrc等配置文件,这些文件里包含了npm的路径配置,因此能正常找到npm命令。
但用单条SSH命令直接执行脚本时,默认是非交互式非登录Shell,不会加载用户个人的环境配置文件——即便脚本里引入了/etc/profile,如果npm的路径没在这个全局配置里,就会出现找不到命令的错误。
解决办法
方法1:让SSH执行时使用登录Shell加载环境
修改SSH命令,用bash -l启动登录Shell来执行脚本,这样会自动加载所有登录时的环境配置:
ssh -tt user@1123.123.123.123 -p 22 'bash -l /home/user/services.sh'
如果你的默认Shell是zsh,就把bash -l换成zsh -l。
方法2:在脚本中使用npm的绝对路径
先手动登录服务器,执行which npm获取npm的绝对路径(比如/usr/local/bin/npm),然后修改services.sh里所有的npm为这个绝对路径,示例:
nohup /usr/local/bin/npm run start:prod &
方法3:在脚本中加载用户个人配置文件
如果npm的路径是在用户个人的~/.bashrc或~/.profile里配置的,在脚本开头添加加载语句:
#!/bin/bash # 加载全局配置和用户个人配置 . /etc/profile . ~/.bashrc # 或者 . ~/.profile,根据实际情况选择
内容的提问来源于stack exchange,提问作者Vlad Stratulat
相关产品推荐
相关产品推荐

