[server] 스크립트를 직접 호출하는 대신 관리자에서`bash -c`를 사용하는 이유는 무엇입니까?

supervisord서버에서 서비스를 제어하는 데 사용 하기 시작했습니다 . 나는 리눅스의 프로 사용자는 아니지만 그것을 잘 사용하여 실행할 수 있습니다.

호기심으로, 감독자의 대부분의 명령이 다음과 같이 호출되는 것으로 나타났습니다.

[program:install]
command=bash -c "/src/etc/install.sh"

bash의 사람을 읽었 -c으며 문자열 뒤에 전달 된 변수를 삽입하는 데 사용해야한다는 것을 알고 있습니다.

따라서 bash -c전달 / 사용되는 변수가 없다는 것을 고려하여 스크립트를 직접 호출하는 대신 감독자 (또는 다른 장소) 에서 사용하는 요점은 무엇 입니까?

[program:install]
command=/src/etc/install.sh

감사!



답변

쉘 패스 팽창 (같은 기능 *, ?), 커맨드리스트 ( ;, &&, ||(), 리디렉션 <, >, |,) 만이 인수 문자열 배열로 명령을 분할한다는 supervisord 구현되지 않는다.

bash -c기능은 명령에서 이러한 기능을 사용하려는 유혹을받는 초보 사용자에게 도움 이 될 수 있습니다. 예를 들어 놀랍게도

command=echo foo > /tmp/bar

foo > /tmp/bar에 쓰는 대신 출력 foo합니다 /tmp/bar.

-c변수와 거의 관련이 없습니다. 배쉬에 대한 모든 추가 인수는 스크립트 인수로 사용할 것 $0, $1명령에 등,하지만 기능은 거의 모든 사용이 없습니다. 예를 들어 bash -c 'echo $0 $0' foo출력 foo foo.


답변

설명서에 설명 되어 있습니다 .

하위 프로세스를 실행할 때 감독자가 셸을 실행하지 않으므로 USER, PATH, HOME, SHELL, LOGNAME 등과 같은 환경 변수는 기본값에서 변경되거나 다른 방식으로 재 할당되지 않습니다. 이는 구성에서 user = 스탠자를 사용하여 루트로 감독자 실행에서 프로그램을 실행할 때 특히 중요합니다.

이 문제를 해결하기 위해 bash -c사용할 수 있습니다.


답변