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 -v
for 가 someuser
반환되고 v9.4.0
명령이 어떤 사용자에게도 설치된 버전을 locate
찾지 못하고 다시 설치했음에도 불구하고 여전히 동일한 오류가 발생합니다. 다음 명령이 유효합니다. 참고하세요v8
node
source ~/.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
env
npm run build
nvm
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 -i
PATH
전체 경로를 제공하지 않는 경우 명령을 찾는 데 사용되는 변수를 포함하는 환경을 정리합니다 . 따라서 를 사용할 때는 env -i
호출되는 명령의 전체 경로를 지정해야 합니다. npm
일어날 수 있는 일은 그 npm
자체가 shebang이 포함된 스크립트이므로 #! /usr/bin/env node
명령 조회가 node
실패한다는 것입니다.
환경을 정리해야 하는 경우 다음 방법 중 하나를 시도해 보십시오.
sudo -iu someuser sh -c "...."
su someuser - -c "...."
(두 명령 모두 로그인 셸을 시작하고 환경을 일부 정리합니다.)또는
env
Ubuntuservice
명령과 같이 일부 환경 변수를 사용하여 보존합니다.$ 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
.