[완료]popen 함수로 스크립트를 호출 했습니다.
=================================================================================
if( ( fpid = popen( cmd, "r" ) ) == NULL )
{
_r = -1;
WriteLog("LINE[%2d] -> copy.sh::ERROR[%s]\n", nLine, cmd);
}
else
{
WriteLog("LINE[%2d] -> copy.sh[%s].. ok\n", nLine, cmd);
}
pclose( fpid );
=================================================================================
copy.sh ( 로컬 a 파일을 자신과 다른 서버( A, B )에 복사 하는 스크립트 입니다. )
cp a c --> a를 로컬서버 c로 복사합니다.
rcp a c --> a를 다른 A서버에 c로 복사합니다.
rcp a c --> a를 다른 B서버에 c로 복사합니다.
=================================================================================
어떤 펑션에서 위와 같이 popen를 열어 스크립트(copy.sh)를 실행 시킨후 바로 pclose를 합니다.
문제는 잘 되다가 어쩌다 한번씩 복사가 안됩니다. 로그를 보면 파이프를 열어 스크립트를 호출한거 같은데요.
이유가 뭘까요?? 혹시 스크립트를 호출하고 바로 파이프를 닫아서 그런건가요??
보통 한 파일을 다른 서버와 동기화 및 업데이트를 할때 어떤 식으로 구현 하시는 지 궁금 합니다.
popen을 안 쓰셔도...
copy.sh의 출력을 저 프로그램이 사용해야할 경우가 아니라면,
그냥 system ()이나 execl ()계열의 함수를 호출해서 copy.sh을 실행하시면 될 것 같습니다.
거기서도 return값은 받을 수 있으니, 괜히 popen을 할 필요가 없을 것 같습니다.
^^ 댓글
^^
댓글 감사드립니다.
알려 주신 방법으로도 가능하군요.. ^^
그런데 문제는 왜 위처럼 파이프로 호출했을때 가끔.. 아주 가끔.. 안되는지 이유를 모르겠습니다.
위에 알려 주신 system() 이나 execl() 의 함수를 썼을때 파이프로 호출한 현상이 안 나올까요??
왜 안되는지가 너무 궁금하네요 ^^
^^
SIGPIPE가 원인일 수도 있습니다.
copy.sh의 환경을 정확히 몰라서 확신하기는 어렵지만,
copy.sh에서 pipe로 출력하는 값들이 있는데,
이게 제대로 읽히지 않은 상태에서 pclose를 하면,
copy.sh에서 SIGPIPE를 받아서 인터럽트에 의한 비정상 종료가 발생될 수 있습니다.
제가 테스트해본 결과는 다음과 같습니다.
^^ 감사합니다.
^^
작업해 보니 파이프 단절이 생기네요 ㅎㅎ
그래서 파이프를 안쓰고 system을 쓰기로 했습니다.
단순 복사 스크립트라서요 ^^
^^
댓글 달기