%EB%A1%9C%20Ruby%20%EC%9D%91%EC%9A%A9%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%98%20%EC%8B%9C%EC%9E%91%20%EC%85%B8%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EC%8B%A4%ED%96%89.png)
Ubuntu 14.04에서 'user01'을 사용하여 RVM을 설치했으며 user01이 예상대로 레일 애플리케이션을 시작할 수 있습니다. 그러나 시스템 시작 후에 이 애플리케이션을 시작하고 싶습니다. 나는 이것을 달성하기 위해 다음을 사용하려고합니다.
/var/script/start.sh
screen -d -m mongrel_rails start -e production -p 8088
/etc/rc.local(0번 출구 앞에 추가됨)
sh './var/script/start.sh'
위의 변경 사항을 사용하면 레일스 애플리케이션이 시작되지 않습니다. 활성 GNU 스크린 세션이 없기 때문에 이를 확인할 수 있습니다(screen -d -m mongrel_rails... 명령은 스크린 세션을 시작하고 분리됩니다. "screen -ls" 명령을 사용하면 세션을 볼 수 있어야 하지만 루트로 전환한 후에도 마찬가지입니다).
루트(sudo su)로 전환하고 애플리케이션을 수동으로 시작하려고 시도했지만 다음과 같이 실패했습니다.
/usr/bin/env: ruby: 해당 파일이나 디렉터리가 없습니다.
나는 RVM/Ruby가 루트에 대해 손상되었다고 생각했습니다. 애플리케이션이 설치되지 않았음을 확인하는 메시지를 반환하는 'ruby -v'를 실행하여 이를 확인했습니다. 설치된 Ruby 버전에 대한 정보를 보는 user01의 경우에는 해당되지 않습니다.
나는 계속해서 이 문제를 해결할 방법을 찾았고이 게시물시작 명령을 실행하는 동안 사용자로 전환하려면 다음 명령을 제안했습니다.
su user01 -c '/var/script/start.sh'
이는 도움이 되지 않았으며 조사한 결과 루트에서 이 계정에 'su user01'을 입력했을 때 user01에 대해 Ruby가 손상되었음을 발견했습니다. 'ruby -v'도 예상 정보를 반환하지 못했습니다. 수동으로 테스트한 후, 'exit'를 입력하면 루트로 돌아가고, 또 다른 'exit'를 누르면 user01(로그인에 사용한 계정)로 돌아가고 Ruby가 이 계정에서 제대로 작동한다는 사실을 발견했습니다.
누구든지 이 문제를 해결할 수 있는 방법을 제안할 수 있나요?
답변1
당신은 사용하고 있습니다RVM따라서 루비가 발견되지 않는 것을 처리하는 적절한 방법은 다음과 같습니다.rvm 래퍼 사용(SysVinit 및 upstart 시스템에서).
먼저(선택 사항) 사용하려는 gemset에 대한 앱 별칭을 만듭니다.
rvm alias create my_app ruby-2.1.4@my_gemset
그런 다음 원하는 래퍼를 만듭니다.
rvm wrapper my_app mongrel_rails
래퍼는 $rvm_path/wrappers/my_app
디렉터리에 생성되며, 사용자를 전환한 후 초기화 스크립트에서 이를 호출합니다.
su user01 -c '/home/user01/.rvm/wrappers/my_app/mongrel_rails -e production -p 8088'
screen
( 화면 내에서 이것을 실행할 이유가 거의 없기 때문에 완전히 제거했습니다 .)
답변2
user01로 로그인하여 실행할 때 '/var/script/start.sh'가 작동한다면 스크립트는 환경 변수에 따라 달라집니다. 해당 변수를 보려면 'env'를 실행하세요. 'su user01 -c'를 통해 루트 계정에서 실행하려고 하면 뭔가 누락되었을 수 있습니다.
제가 제안하고 싶은 것은 su와 함께 특수 옵션 '-'을 사용해 보는 것입니다. 매뉴얼 페이지에서:
-, -l, --login
make the shell a login shell, clears all envvars except
for TERM, initializes HOME, SHELL, USER, LOGNAME and PATH
따라서 명령은 다음과 같습니다.
# su - user01 -c '/var/script/start.sh'
이런 식으로 user01은 쉘을 로그인 쉘로 만들고, envvar를 지우고 맨 페이지에 명시된 대로 다른 모든 항목을 초기화합니다.