2013-07-13 3 views
4

필자는 시스템에서 일부 프로세스를 시작하기 위해 bash 스크립트를 작성했습니다. 단순히 프로세스와 관련 구성 파일을 호출합니다. 커맨드 라인에서 호출하는 것과 같습니다. 쉘에서 스크립트를 호출하는 것과 system()을 사용하는 것의 차이점은 무엇입니까?

#!/bin/bash 
# Start specified process in a new session 
setsid $1 &>/dev/null & 

그래서 someprocess를 시작, 내가 명령 줄에서 부를 것이다 :

[email protected]:~# start someprocess 

을이 마법처럼 작동합니다. 매번 모든 프로세스. 그러나 다른 실행중인 C++ 프로세스에서 system 호출을 만들 때 someprocess은 절대로 시작되지 않습니다.

system("start someprocess") 

이 프로세스는 내 프로세스의 90 %에 해당합니다 (단 하나만 제외). 작동중인 프로세스와 작동하지 않는 프로세스의 유일한 차이점은 작동하지 않는 프로세스가 독점 라이브러리를 사용한다는 것입니다. 나는 최근에 새로운 세션을 시작하는 것이 도움이 될 것이라는 희망으로 bash 스크립트에 setsid 옵션을 추가했지만 아무런 효과가 없었다. 나는 또한 popenexecv을 시도했습니다. 변경 없음.

그럼 내 질문은 무엇입니까 system()과 함께 뭔가를 호출하고 그냥 명령 줄에서 동일한 호출을 만드는 차이점은 무엇입니까?

모든 프로세스는 Linux의 C++로 작성되었습니다.

+1

다른 점 : 아마도 환경입니까? –

+1

일반적인 용의자 인 LD_PATH, 환경 변수 등을 확인 했습니까? C++ 시스템 래퍼는 동일한 사용자 및/또는 루트 등입니까? 어떤 종류의 errno 값은 시스템, popen, execv 등에서 돌아오고 있습니까? – Duck

+0

@Kerrek SB, @Duck'~ /. '에 환경 변수가 설정되어 있습니다.bashrc' 프로그램에서'system()'을 사용하여 프로그램을 시작할 때 어떻게 설정되어 있는지 확인하는 방법은 무엇입니까? 나는 bash 스크립트를 호출하는 것이'bashrc '가 소스로되어 있음을 의미한다고 생각했다. –

답변

2

.bashrc은 대화식 비 로그인 쉘로 bash를 실행하는 경우에만 호출됩니다. 비대화 형 쉘로 호출 된 경우, system()을 bash shebang이있는 스크립트에서 사용하는 경우 $BASH_ENV이 가리키는 구성 파일 만 읽습니다. 다음 옵션 의미

:

  • 오두막에 -l를 추가 - system()
  • 추가를 호출하기 전에 공급하고자하는 스크립트에 $BASH_ENV을 설정
  • 시작시 ~/.profile을 읽어 쉘 원인 -i을 shebang에 - 대화식 쉘로 bash를 호출하고 ~/.bashrc을 읽게하지만 bash가 입/출력을 처리하는 방법에도 영향을 미칩니다.

첫 번째 옵션을 권하고 싶습니다.

bash가 시작 파일 인 here을 읽는 방법에 대한 자세한 설명을 찾을 수 있습니다. 나는 이것이 당신의 문제를 완전히 해결할 지 확신하지 못한다. 그러나 그것은 문제의 그 부분에 약간의 빛을 비칠 수있다.

+0

첫 번째 두 가지 해결책은 효과가없는 것처럼 보였지만 모든 쉘 변수에 소스 명령을 포함시킬 수 있었다. 나를 올바른 길로 가게했다. 감사! –

2

system() 호출에 사용 된 환경 변수를 확인하십시오. 예를 들어, 시스템을 호출하여 일부 변수를 출력하고 명령 행에서 볼 수있는 것과 일치하는지 확인하십시오.

가능성이 높습니다. 올바르게 출처를 밝히지 않았습니다.

관련 문제