본문 바로가기

IT/리눅스 Linux

리눅스 screen 명령어, cannot open shared object 에러

반응형

리눅스에서 콘솔 프로그램을 백그라운드로 실행해야 할 경우 유용한 명령어가 screen 입니다.

간단하게 nohup 등을 사용할 수도 있지만  screen 명령어가 더 강력하고 유연하게 사용할 수 있어서 많이 사용 되는 것 같네요.

저도 startup 스크립트 내에서 screen 을 이용해서 detach 모드로 서버 프로그램을 실행시키곤 합니다.


지금까지 잘 사용하고 있던 screen  명령어였는데, 최근에 특정 서버에서 에러가 발생해서 그 해결책을 공유하고자 합니다.


screen을 통해 startup 스크립트를 실행하면, screen을 통해 실제로 실행되는 어플리케이션이 다음과 같은 에러를 발생시키더군요.


... error while loading shared libraries: .... cannot open shared object file: No such file or directory


리눅스 관리자나 개발자분들은 다 아시겠지만 shared library 가 들어 있는 디렉토리가 환경변수 $LD_LIBRARY_PATH 에서 정의되지 않으면 발생하는 에러입니다.


구글 검색을 통해서 -c 옵션을 주고 setenv 로 $LD_LIBRARY_PATH  환경변수를 명시적으로 넘겨 봐도 결과는 동일하더군요.

구글링을 좀 더 해서 결국 좋은 답을 찾아냈습니다.

원문 링크 : http://superuser.com/questions/235760/ld-library-path-unset-by-screen


결론은 보안상의 문제때문에 리눅스에서 특정 환경변수 (LD_ 로 시작되는) 를 setuid / setgid 가 걸려 있는 프로그램이 수행될 때 넘겨주지 않는 것이 원인이었습니다.

시스템이 설치될 때 screen 명령어는 (/usr/bin/screen) 기본적으로 setgid 가 걸려 있습니다.



따라서 이 setgid 를 제거해 주면 $LD_LIBRARY_PATH 환경변수가 screen 안으로 그대로 전달이 되어 문제가 해결 됩니다.

다만 한 가지를 더 해 줘야 하는데, screen 에서 setgid가 삭제되면 /var/run/screen 디렉토리로 쓰기가 불가능해 지므로 screen 명령어 자체가 에러를 발생하면서 실행되지 않습니다.

그래서 해당 디렉토리에 777 권한을 부여해 주면 문제가 해결 됩니다.


즉 아래 2줄의 명령어만 (root 권한 필요) 수행해 주면 된다는 말씀~



필요하셨던 분들에게 도움이 되었으면 좋겠네요. 감사합니다.

반응형