취미생활
[Linux] Default shell 이 다를 때 발생한 문제와 해결책 본문
중국 출장 중 고객사에서 이상한 통보를 해왔다.
우리 프로그램이 실행이 안된다고 일단 와보라고 한다.
이번엔 또 뭐가 문제인고 해서 가보니 참 어이없는 현상을 발견했다.
우리 시스템은 Default shell 로 bash 를 사용하는데 고객사 측에서 이를 임의로 csh로 변경하고 안된다고 했던 것...
> 아니... 님들이 shell 을 바꾸셨잖아요 님들이 해결 하셔야죠;;;;
< 그건 모르겠고 왜 안되요? 빨리 해결해요
그래 고객사에서 까라면 까야지 어쩌겠는가?
불필요한 업무가 생기면서 업데이트 일정은 연기가 되겠지만, 그것또한 고객사가 감내해야 할 일이겠지
Default shell 이 다를 경우 rc, profile 파일을 읽어오지 못한다.
csh 을 사용한다는 말을 듣자마자
"bashrc, bash_profile 파일을 참조하지 못하겠구나" 라는 생각이 들었다.
이는 상당히 치명적인데 이를 알기 위해선 rc, profile 파일에 대해 간략하게 알고 넘어가야한다.
rc, profile 파일에 대해 간략하게 설명하자면, .bashrc, .bash_profile 파일과 같이 shell login, ui login 시 참조하는 파일이다.
주로 시스템 환경 변수나 설정 값들이 들어있다.
내가 현재 다니고 있는 회사의 경우 자체 라이브러리를 구축해서 PATH 환경 변수에 라이브러리 참조 경로가 들어있는데 해당 환경 변수가 추가되지 않으면 프로그램 자체가 실행되지 않는다. 쉽게 말해 프로그램 또는 라이브러리가 어디있는 지 알 수 없는 현상이 발생한 것이다.
이러한 점을 해결하기 위해 몇 가지 꼼수를 사용했다.
해결책
첫 째로 cshrc 파일의 마지막에 bash shell 을 실행하도록 변경했다.
csh 을 사용하는 이유에 대해 물어보니 자신들의 Default shell 이 csh 라서 그런 거고 bash 를 추가로 켜도 상관없다는 허락을 받았기에 cshrc 파일의 마지막에 bash shell 을 실행하도록 했다.
이는 상당히 웃긴 상황인데,
chsh 명령어를 통해 Default shell 을 변경하기만 하면 될 일을 굳이 돌아서 가는 상황이 발생한 것이다.
하지만, 어쩌겠는가?
고객사가 해달라는 대로 해줘야 하는게 운명인 것을...
하지만, 이런 꼼수만 가지고는 프로그램을 정상적으로 실행하지 못했다.
현재 다니는 회사에서는 실행 프로그램과 메인 프로그램이 따로있는 구조인데,
메인 프로그램 실행 시, Terminal 을 새로 띄워 Log 를 볼 수 있도록 만들었다.
이러한 구조는 디버깅에 상당히 편리했지만 슬프게도 Default shell 이 csh 인 상황에서는 큰 문제가 되었다.
Terminal 을 새로 띄우면 Default shell 인 csh 으로 실행된다 !
이러한 점을 해결하기 위해선 Terminal 실행 방식을 변경해야 했는데 아래와 같이 변경했다.
void execMain()
{
char szCmd[1024] = {0};
// sprintf(szCmd, "konsole -e main program"); // old-code
sprintf(szCmd, "konsole -e bash --login --rcfile ~/.bashrc -c \"main program\""); // new-code
system(szCmd);
}
기존에는 konsole 에서 main program 을 실행하는 방식이었다면
수정한 이후에는 konsole -> bash -> main program 을 실행하는 방식으로 변경했다.
여기서 중요한 점은 bash 실행 옵션이다.
--login 옵션을 넣지 않으면 rcfile 을 참조하지 않고
rcfile의 위치가 ~/.bashrc가 아닐 경우 --rcfile 옵션을 통해 bashrc 파일의 위치를 지정해주어야 한다.
그리고 bash 옵션의 마지막에는 --c 옵션을 통해 실행할 커맨드를 입력해주면 해결된다.
이거 해결하겠다고 2주간 짱구를 어떻게든 굴려가며 해결했는데 막상 해결해보니 너무 허무한 듯 하다.
아니 애초에 csh 쓴다고 얘기라도 해줬으면 이렇게 불려가진 않았을 텐데..
결론
Default shell 이 다를 경우 rc, profile 파일을 확인해야 한다.
해결이 불가능할 경우 bash --login -c "execute code" 를 통해 문제를 해결할 수 있다.
고객사를 믿지마라