[Linux][오류노트] ldd, ls -alR , chown - 같은 리눅스(solaris) 환경인데 소프트웨어가 동작안했던 경험

2020. 6. 16. 10:42SERVER/Linux

이번에 프로젝트에 나가서 소프트웨어를 설치할 일이 있었다. 

 

소프트웨어를 설치하고 기동하는데 정상 동작을 안하는 현상이 발생하였다. 로그를 확인해보니 로그 역시 이상이 없었다.

 

개발서버와 환경이 solaris로 동일한 상태에서 같은 제품으로 설치를 했는데 위와 같은 현상이 벌어져서 한참 고민하다가 

 

다시 설치도 해보고, 계정을 바꿔서 실행도 해보고, 

 

ls -alR | grep root 로 폴더에 있는 루트 계정을

chown -R a:b ./*              현재폴더 부터 하위 폴더를 전부 a:b 의 권한으로 바꿔주고 

a계정으로 들어가 실행도 해보고.... 별걸 다했는데 안됐다.

 

근데 터미널을 껐다가 접속하니 정상동작 했다......????

 

이유는 모르지만 현상이 이러하다 라고 다른 회사의 담당 개발자한테 말했는데 그분은 OS를 담당했었는지,

터미널을 껐다가 켰을때 동작하는 현상이면 .profile에 환경변수가 추가 된게 적용안된게 아닐까요 해서  옳다구나 하고 찾아봤다.

 

그분이 말씀한대로 .profile에 ld_library_path = /root/소프트웨어/lib/* 와 같이 소프트웨어의 라이브러리 패스가 추가되어 있었다.

 

추가한거냐고 물어보시길래 아뇨 추가한적 없다 라고 했고 소프트웨어 내부적으로 추가해주나보다 라고 생각하고 원인을 찾기 시작했다.ㅣ

 

env 명령어 echo 명령어를 사용해서 기존환경에서  ld_library_path 가 있나 확인했는데 환경변수가 등록되어 있지 않았고

기존 환경에는 .profile에 export ld_libary_path = 하고 써져있지도 않았다.

 

 

그래서 프로그램을 재설치 할때 .profile 에 ld_libary_path = 가 추가 되었다고 생각했는데 원인을 찾기 위해 

 

 

ldd 명령어를 사용하였다.  ldd 명령어는 엄청 신세계였다.

 

 

http://snowdeer.github.io/linux/2017/08/17/how-to-use-ldd/

 

ldd 사용법 · snowdeer's Code Holic

ldd 사용법 17 Aug 2017 | 리눅스 명령어 실행 파일은 있는데 필요한 라이브러리가 없는 경우 실행 파일은 있는데 필요한 라이브러리가 없는 경우 다음과 같은 오류 메세지를 출력합니다. ./snowdeer: er

snowdeer.github.io

 

 

실행 파일은 있는데 필요한 라이브러리가 없는 경우

실행 파일은 있는데 필요한 라이브러리가 없는 경우 다음과 같은 오류 메세지를 출력합니다.

 

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

 

출처를 보면 알수 있듯이 위처럼 프로그램을 실행하다보면 라이브러리가 없는 경우가 발생한다.

 

예전에도 위와 같은 오류가 났을때 그프로그램을 찾아서 받아줬었는데 저런 오류가 안떠서 라이브러리가 없어서 프로그램이 동작안하는건지도 몰랐었다.

 

 

List Dynamic Dependencies`

ldd 명령어는 프로그램이 사용하고 있는 공유 라이브러리(Shared Library) 리스트를 출력합니다. ‘List Dynamic Dependencies’의 약자입니다.

 

 

위와 같이 snowdeer라는 파일이 사용하는 라이브러리 리스트가 출력이 되며, 라이브러리 이름 옆에 위치가 출력이 됩니다. 만약 라이브러리가 없다면 이름 옆에 => not found 라는 메세지가 출력됩니다. 즉, 필요한 라이브러리들을 확인해서 시스템 폴더 아래 복사를 해주면 됩니다.

 

사용 예제

ldd ./snowdeer | grep "not"

다만 ldd 명령어로도 필요한 라이브러리들이 한 번에 안 나오는 경우도 종종 있는 것 같습니다. 그럴 때는 필요한 라이브러리들을 먼저 설치한다음 다시 ldd 명령어로 확인할 수 있습니다.

 

 

 

 

 

 

 

 

정말 신기했던게 ldd 명령어로 실행할 프로그램을 입력하니 개발 환경에서는 특정 라이브러리가

libstd~~ ->/usr/lib/libstd~~.2.0.64 와 같은 형식으로 잡혀있었고

 

안되던 운영 환경에서는 

 

libstd~~ -> not found가 뜨고 있었다.

 

소프트웨어를 재설치하니

 

.profile 파일에 export ld_library_path = ~ 환경변수가 추가되면서

 

ldd 로 다시 명령어를 치니

 

libstd ~~ -> /root/소프트웨어/lib/libstd~~2.0.64  즉 다른 경로를 잡는게 확인 되었다

 

 

/usr/lib/64

/usr/lib/ 

 

라이브러리가 들어있는 경로가 있는데 소프트웨어에서 차례로 찾은다음 못찾으니 ld_library_path 를 환경변수에 추가 하는 구문을 달아 놓은 듯 하다.

 

 

 

 

 

반응형