Bash 스크립트가 npm 명령을 올바르게 처리하지 않습니다.

Bash 스크립트가 npm 명령을 올바르게 처리하지 않습니다.

git다음과 같이 사용자를 기반으로 일부 명령을 실행하는 스크립트가 있습니다.npm

#!/bin/sh
/bin/su someuser -c "
cd /opt/app1/;
env -i git remote update;
env -i git pull origin dev;
cd /opt/app1/client/;
npm run build;
"

명령이 git올바르게 실행됩니다. 명령 npm이 실행되고 파일을 빌드하지만 많은 오류가 발생합니다.

Node Sass could not find a binding for your current environment: Linux 64-bit with Node.js 8.x

Found bindings for the following environments:
  - Linux 64-bit with Node.js 9.x

This usually happens because your environment has changed since running `npm install`.
Run `npm rebuild node-sass --force` to build the binding for your current environment.

npm run build터미널에서 사용자로 실행 하면 모든 것이 잘 작동합니다. 나는 심지어 env -i npm run build스크립트에서 그것을 시도했고 이것이 결과였습니다 env: ‘npm’: No such file or directory. 그래서 그때 해봤는데 env -i /usr/local/bin/npm run build이상하게 다시 나오더라고요 /usr/bin/env: 'node': No such file or directory.

나는 이것이 user -c사용자 로그인과 같은 모든 환경을 설정하고 부모 없이도 env -i나를 깨끗하게 만들 것이라고 생각했습니다.env

또한 시도했습니다:

#!/bin/sh
/bin/su someuser - -c "
cd /opt/app1/;
git remote update;
git pull origin dev;
cd /opt/app1/client/;
npm run build;
"

마지막 시도는 첫 번째와 동일한 결과를 반환합니다. git 명령이 작동하고 빌드는 터미널에서 사용자로 명령을 실행할 때 다른 것처럼 sass와 환경에 대한 오류를 발생시킵니다.

이 명령이 제대로 작동하지 않는 이유를 아시나요?

답변1

노드 오류를 살펴보라는 Olorin의 제안에 따라 저는 이 문제를 좀 더 조사했습니다. node -vfor 가 someuser반환되고 v9.4.0명령이 어떤 사용자에게도 설치된 버전을 locate찾지 못하고 다시 설치했음에도 불구하고 여전히 동일한 오류가 발생합니다. 다음 명령이 유효합니다. 참고하세요v8nodesource ~/.nvm/nvm.sh;

#!/bin/sh  
/bin/su tstapps -c "
cd /opt/app1/;
git remote update;
git pull origin dev;
cd /opt/app1/client/;
source ~/.nvm/nvm.sh;
npm run build;

나는 nvm use v9.5.0그것 없이도 여전히 작동하는지 한 번 테스트했습니다. 다음에는 떼어냈는데 source ~/.nvm/nvm.sh;또 부러졌어요. 그래서 분명히 그것을 소싱하고 볼 필요 없이 그것을 얻을 수 있는 방법은 없습니다 nvm.shell-scripts envnpm run buildnvm

nvm이상한 문제입니다. 일부 사용자가 다음을 기반으로 리소스를 사용할 때 비슷한 문제를 겪고 있는 것 같습니다.bash이 스레드. 아직도 그것이 어디서 v8나온 것인지 확실하지 않습니다. v8설치 디렉토리에서 include/node가져오지 않는 한 v9. 예:

/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-platform.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-profiler.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-testing.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-util.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-value-serializer-version.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-version-string.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-version.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8config.h

답변2

env -iPATH전체 경로를 제공하지 않는 경우 명령을 찾는 데 사용되는 변수를 포함하는 환경을 정리합니다 . 따라서 를 사용할 때는 env -i호출되는 명령의 전체 경로를 지정해야 합니다. npm일어날 수 있는 일은 그 npm자체가 shebang이 포함된 스크립트이므로 #! /usr/bin/env node명령 조회가 node실패한다는 것입니다.

환경을 정리해야 하는 경우 다음 방법 중 하나를 시도해 보십시오.

  • sudo -iu someuser sh -c "...."
  • su someuser - -c "...."(두 명령 모두 로그인 셸을 시작하고 환경을 일부 정리합니다.)
  • 또는 envUbuntu service명령과 같이 일부 환경 변수를 사용하여 보존합니다.

    $ grep env $(command -v service) -m1
    out=$(env -i LANG="$LANG" LANGUAGE="$LANGUAGE" LC_CTYPE="$LC_CTYPE" LC_NUMERIC="$LC_NUMERIC" LC_TIME="$LC_TIME" LC_COLLATE="$LC_COLLATE" LC_MONETARY="$LC_MONETARY" LC_MESSAGES="$LC_MESSAGES" LC_PAPER="$LC_PAPER" LC_NAME="$LC_NAME" LC_ADDRESS="$LC_ADDRESS" LC_TELEPHONE="$LC_TELEPHONE" LC_MEASUREMENT="$LC_MEASUREMENT" LC_IDENTIFICATION="$LC_IDENTIFICATION" LC_ALL="$LC_ALL" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1)
    

    이 모든 것이 필요하지 않을 수도 있지만 을 유지 $PATH하거나 $TERM설정하면 됩니다 LC_ALL=C.

관련 정보