프로세스들은 우선순위를 가지며 관리되고 ps -l로 프로세스 우선순위를 확인할 수 있다. 해당 명령어로 PRI와 NI가 나타난다.
PRI는 커널이 사용하는 우선순위 항목으로 0~139값이다. 0~99는 시스템에 예약된 우선순위이고 사용자 공간 프로세스(user space process)는 100~139가 할당된다. PRI는 조작될 수 없다.
NI(nice)는 root나 사용자가 조작하는 값으로 -20~19까지 설정 가능하다. 값을 낮추는 것은 root만 가능하다.
NI 값을 설정하면 리눅스가 PRI를 변경하여 우선순위를 조정한다.
/proc은 가상 파일 시스템, 프로세스 상태 정보와 기타 시스템 및 하드웨어 정보를 확인 할 수 있다.
ps 명령어로 프로세스 정보 확인할때 해당 디렉터리 참고한다. 새로운 프로세스 생성되면 /proc/PID 서브 디렉터리가 생성되고 해당 프로세스 정보 저장된다.
p334
p334
스케줄링이란 특정 시간에 특정 작업을 수행하게 하는 것이다. 리눅스에서는 at과 cron이 있는데 모두 데몬으로 실행 중이어야 한다.
(1)at은 주로 한 번만 실행 (2)cron은 주기적으로 프로세스를 실행할 때 사용한다.
at,atq, crontab
atd 데몬에 의해 실행되고 지정한 작업은 queue에 저장되고 저장된 작업은 /var/spool/at 디렉터리 아래 파일로 저장된다.
결과는 root 사용자의 메일로 전송한다.

[Option] 작업번호 필수 지정
-q 큐이름: 대기큐 지정(a-z A-Z). 지정 안 하면 기본큐 a 사용
-c 작업: 작업 정보 출력
-d: 예약한 작업 삭제(=atrm) => atrm 4 4번 작업 삭제
-l: 큐에 있는 작업 출력(=atq) => 작업 번호, 실행 날짜/시간, 저장된 큐, 사용자 순서
at -d 1 1번 작업 삭제
at -c 1 1번 작업 정보 출력
at now+3hours
주기적으로 실행하는 작업은 시스템 운영에 필요한 작업 or 사용자의 필요에 의한 작업 이 있다.
시스템 운영에 필요한 경우 (1) root권한으로 /etc/crontab에 등록 (2) 사용자는 crontab 명령어 수행으로 등록 가능하다.
crontab 파일 총 7개 필드
분 시 일 월 요일 사용자이름 command
- 일(1~31), 요일은 (0~7, 0과 7은 일요일)
- 사용자이름은 일반적으로 생략
- command는 실행할 명령어
crontab주의! 삭제의 경우 at은 -d, crontab은 -r
crontab -ir 크론탭 설정 파일 삭제전 질의 묻기
crontab schedule.txt 해당 파일에 설정된 내용을 등록
p339 크론탭 설정 예시
ps, pstree, top, kill, killall, jobs, bg, nice, renice, nohup, pgrep, pkill
동작중인 프로세스의 상태 출력
[Option]
a: 터미널과 연관된 프로세스
x: 데몬프로세스처럼 터미널에 종속되는 프로세스
u: 프로세스의 소유자 기준으로 출력
e: 해당 프로세스에 관련된 환경 변수 정보 함께 출력
f: 프로세스간 상속 관계를 트리 구조로 출력
ps aux 시스템에 동작중인 모든 프로세스를 소유자정보와 함께 출력
프로세스 상태를 트리구조로 출력
[Option]
-h: 실행중인 프로세스와 실행한 명령부분 진하게 강조
-p: pid도 출력

pstree -h 실행중인 프로세스 정보를 트리 구조로, 실행한 명령 부분 진하게 강조하여 보여준다.
동작중인 프로세스의 상태를 실시간으로 화면에 출력
[Option]
-d 갱신시간: 초단위
-p: 특정 PID값 모니터링
-b: 배치모드 => 다른 프로그램이나 파일 전송할 때 사용(-n 옵션과 함께 사용)
-n: top명령어 실행 횟수
top -d 2 -p 1222 1222 PID 프로세스를 2초 간격으로 정보 출력
top -bn 3 > top.log top 명령어 배치모드로 3회 실행하여 top.log 파일에 저장
[top 주요 항목]
RES: 프로세스가 사용하는 실제 메모리양(resident size)
SHR: 프로세스가 사용하는 공유메모리양
TIME+: 프로세스가 시작하여 사용한 총 cpu 시간
COMMAND: 프로세스를 실행한 명령

첫째줄: 현재 시간, 서버 구동후 시간, 접속한 사용자수, 1분/5분/10분 시스템 부하
둘째줄: 프로세스 상태
세번째줄: cpu 사용량
명령어 실행 목적어 kill PID,작업번호 killall 프로세스이름 pkill 프로세스이름
PID나 작업번호로 프로세스에 특정 시그널을 보내는 명령. 옵션 없으면 SIGTERM(15)를 보낸다.
보통 중지시킬 수 없는 프로세스를 종료시킬때 사용한다.
kill -l 시그널 종류 출력
kill 724 724 PID에 SIGTERM 시그널 보낸다. (=kill -15 724, kill -TERM 724, kill -s SIGTERM 724)
kill %2 작업 번호가 2인 프로세스를 종료
프로세스이름으로 실행한다. 한 데몬의 여러 프로세스를 한 번에 종료시킬 때 사용 => killall [option] 프로세스명
[Option]
-v: 시그널 전송 결과 출력(--verbose)
killall -HUP httpd httpd 데몬을 다시 실행시킨다. httpd 프로세스들이 재시작된다.
killall -9 -u posein posein사용자의 모든 프로세스들에게 SIGKILL 보낸다.
백그라운드 혹은 중지된 프로세스 목록 출력
jobs
jobs -l PID 추가로 출력
백그라운드 프로세스 -> 포어그라운드 프로세스
fg %2 = fg 2
포어그라운드로 실행중인 프로세스를 (1)ctrl+z 눌러 작업 중지시키고 (2)bg 명령어로 백그라운드로 전환

실행중인 프로세스 우선순위 변경시 PID, 사용자이름, 프로세스 그룹ID를 이용한다.
nice는 프로세스명으로 우선순위 조정, 명령 실행시 새로운 프로세스 추가, 기존 NI값에 증감되는 형태
renice는 주로 PID 사용하고(옵션으로 사용자이름, 그룹id가능) 기존 프로세스를 교체하여 조정한다. NI값 바로 지정 가능
root만 NI 낮출 수 있는 것은 동일하다.
프로세스명으로 NI값 설정(NI기본값은 0), 지정 가능 범위는 -20~19, 일반사용자는 증가만 가능, root만 감소 가능
기존 프로세스 그대로이고 새 NI 값 가지는 프로세스 추가로 발생, 기존 NI값에서 증감하는 방식
[Option]
-n: 증감 값, 기본은 10이다.
nice 설정된 NI 값 출력
nice --10 bash bash의 NI값 10감소 => 우선순위 높인다.

nice 명령어 실행하면 NI값이 변경된 프로세스가 추가로 발생한다. exit하면 원래의 프로세스로 돌아간다.
주로 PID로 NI값 설정, 기존 프로세스를 교체, NI값 바로 지정 => PRI는 시스템 상황에 맞춰 변경된다.
사용법 renice [option] NI PID
[Option]
-u: 사용자 이름
-g: 그룹ID
renice 1 987 -u daemon root -p 1222 PID가 987과 1222, 사용자가 daemon과 root인 프로세스의 NI를 1로 지정
로그아웃하거나 작업 중인 터미널 창 닫혀도 실행중 프로세스를 백그라운드 프로세스로 작업될 수 있도록하는(=계속 작업 수행돼) 명령어
& 명시해야한다. 즉, nohup은 백그라운드로 실행되는 명령행 앞에 붙이는 명령
nohup tar cvf source.tar /opt/src &
프로세스 이름으로 PID 검색하는 명령. 옵션에 따라 사용자나 그룹명으로도 검색 가능하다.
[Option]
-u: 사용자 이름
-U: UID
-g: 그룹 이름
-G: GID
-t: 특정 터미널에서 실행중인
-l: 프로세스명도 출력
pgrep httpd
pgrep -u posein,yuloje
pgrep -t tty2
프로세스명으로 시그널 보내는 명령. 기본 시그널 TERM(15)이다.
[Option]
-u: 사용자 이름
-U: UID
-g: 그룹 이름
-G: GID
-t: 특정 터미널에서 실행중인
-l: 프로세스명도 출력
pkill -9 -u yuloje yuloje 사용자의 프로세스를 강제종료(KILL) 시그널 전송
리눅스에서 사용되는 프로그램은 C언어로 된 소스 파일을 tar로 묶은 후 압축하여 배포된다.
프로그램 설치를 위해서는 1.압축 풀기 2.디렉터리 이동 후 configure,make,make install 작업을 걸쳐야 한다. 특히 configure작업은 어렵다.
따라서 리눅스 배포판은 패키지 관리기법을 만들었고 최근에는 온라인 기반을 지원한다.
| 배포판 | 기본 패키지 관리 기법 | 온라인 패키지 관리 기법 |
|---|---|---|
| 레드햇 계열 | RPM | YUM |
| 데비안 계열 | Dkpg | apt-get |
| 수세 계열 | YaST | zypper |
.rpm 형태로 파일 배포하고 rpm 명령어로 설치,갱신,제거,검증,질의 관리 가능하다.
rpm파일 형식은 패키지이름-버전-릴리즈.리눅스버전.아키텍처.rpm 이다.
-릴리즈: 몇 번 빌드했는지
-리눅스버전: 기준이 되는 리눅스 버전 (ex)el7(enterprise linux 7), centos 등
-아키텍처: 패키지가 사용 가능한 시스템 (ex)x86_64
(ex) httpd-2.4.6-90.el7.centos.x86_64.rpm =>최근에는 리눅스버전에 el7과 centos 함께 표기하기도 하다.
1.설치 및 갱신 2.제거 3.질의 4.검증모드 5.리빌드 => 총 5가지 모드로 나눌 수 있다.
설치 및 갱신 모드
[Option]
-i: 새 패키지 설치, 이전 버전 패키지 존재시 설치X
-U: 기존 패키지 업그레이드, 설치된 패키지 없으면 새 패키지 설치(이 경우 -i와 같다)
-F: 이전 버전이 설치된 경우만 설치
-v: 메시지 자세히 보여준다.
-h: 설치 상황 '#'기호 표시한다.(--hash)
rpm -i gftp-2.0.19-fc15.i686.rpm rpm 설치
rpm -Uvh 패키지명 패키지 업데이트, 메시지와 진행상황을 #기호로 출력
rpm -Fvh 패키지명 기존 패키지 있는경우만 업데이트, 메시지와 진행상황 #기호로 출ㄺ
제거 모드
-e옵션을 사용. 의존성 존재시 제거되지 않는다. 의존성 있는 경우 (1)관련 패키지 삭제 혹은 (2)--nodeps옵션 지정한다.
[Option]
-e: 삭제, 의존성 존재시 삭제되지 않는다.
--nodeps: 의존성 갖는 패키지 있어도 삭제
rpm -e httpd --nodeps
rpm -qa 설치된 모든 패키지 정보 출력
rpm -qi sendmail 패키지 정보 출력
rpm -ql sendmail 패키지가 설치한 파일 목록
-qc: 환경설정 파일 및 실행 데몬 스크립트
-qf: 해당파일 설치한 패키지 정보
-qd
-qR
rpm -q --changelog sendmail 바뀐 내역 최근부터 연대순으로 보이기
-qip: 패키지 파일 정보 출력
-qlp: 패키지 파일에서 설치되는 파일 목록 정보
rpm -qp --filesbypkg *.rpm 확인하고 싶은 패키지 파일 많은 경우 각 파일 앞에 패키지 이름 붙이기
rpm -qa --queryformat "%10{size} %{name}\n"
검증모드
-V(--verify) 옵션을 사용하여 패키지의 메타데이터 정보를 이용해 변경된 정보를 찾아내는 모드이다. 파일의 크기, 허가권, 소유권, 파일 형식 등 정보 출력한다.
[검증코드] p357
S: 파일 크기 변경
M: 파일 모드(permission & filetype) 변경
U: 소유자 변경
T: 수정시간(modify time) 변경

[Option]
-V: 검증 시 기본 옵션
-a: 모든 패키지 검사
rpm -Va 설치된 모든 패키지 검증
리빌드 모드 rpmbuild
--rebuild옵션으로 소스파일인 .src.rpm 파일을 패키지 파일로 만드는 모드
rpmbuild --rebuild gftp-2.0-8.fc18.src.rpm => root가 실행한 경우 /root/rpmbuild 디렉 안에, x86_64기반인 경우 /root/rpmbuild/RPMS/x86_64 디렉 안에 생성.
rpm 기반 시스템에서 네트워크를 통해 패키지 쉽게 설치와 자동 업데이트 수행하는 명령행 기반 유틸리티
의존성 문제 자동으로 해결
yum 환경 설정 파일 /etc/yum.conf
설치 및 업데이트 저장소 관련 파일 /etc/yum.repos.d 디렉터리 안에
... p359
yum [option] [command] [패키지 파일명]
[Option]
-y: 모든 질의에 yes 답한다.
-v: 자세한 정보 출력(--verbose)
[command] [ ]값은 없어도 되는 값, 없는 경우 전체 패키지가 대상
list [항목값][패키지명]: 전체 패키지에 대한 정보 출력, 항목값 기본은 all이고 / 설치된 installed / 업데이트 가능 updates 등 가능. 패키지명으로도 검색가능하다.
info [패키지명]: 패키지 정보
update [패키지명]
install [패키지명]
search [문자열..]: 문자열 포함된 패키지 찾기
remove, erase [패키지명]: 패키지 제거
group list: 패키지 그룹에 대한 정보 출력
group info 패키지그룹명: 관련된 패키지 정보
group update 패키지그룹명: 지정한 그룹의 패키지를 업데이트
group install 패키지그룹명
group remove 패키지그룹명
whatprovides: 특정 파일이나 기능과 관련된 패키지 정보 검색
clean [설정값]: yum과 관련한 저장된 정보 삭제. all, packages,,,
history [sub-command]: yum 명령어 사용 이력 정보. 하위 명령어로 list, info, undo, redo 작업번호
[Ex]
yum search music music이라는 문자열이 들어있는 패키지 찾기
yum list 전체 패키지 정보 출력
yum list installed
yum info 모든 패키지 정보 출력
yum group list 패키지 그룹별 설치 정보 출력한다. 설치된 그룹은 Installed Groups / 설치되지 않은 그룹은 Available Groups
yum clean all yum 관련 정보 모두 삭제
yum history yum 관련 작업 이력 모두 출력
yum history undo 20 ID가 20인 작업 취소

데비안 리눅스는 패키지 관리 도구 dpkg를 사용한다. 관련 프로그램을 .deb 파일로 배포한다.
.deb 파일 형식은 패키지이름_버전-릴리즈-아키텍처 이다.
데비안 패키지 관리 프로그램으로 (1)dselect (2)alien이 있다.
(1)dselect는 메뉴 이동 방식으로 명령해 옵션 방식인 dpkg비해 사용이 쉽다.
(2)alien은 deb및 rpm 등 다른 종류의 리눅스 패키지 형식을 상호 변환해주는 유틸리티이다.
-i 패키지파일명: 패키지 설치
-R 디렉터리명: -i 옵션과 함께 사용하여 지정한 디렉터리 안의 모든 패키지를 설치
-l: 설치된 패키지 출력
-L 패키지명: 패키지가 설치한 파일 목록(--listfiles)
-l 패키지파일명: 패키지 정보 출력
--unpack 패키지파일명: 환경설정은 안 하고 패키지 풀기만
--configure 패키지명: --unpack한 패키지 환경설정
-r 패키지명: 패키지 제거하는데 환경 설정 파일은 남긴다.
-P: 환경설정까지 삭제(--purge)
-s 패키지명: 패키지에 대한 상태 출력(--stauts) => 패키지 버전, 패키지 관리자, 설명, 환경 설정 파일 등 출력
dpkg -iR 디렉터리 디렉터리내 모든 패키지 설치
dpkg -L vim vim 패키지에서 설치된 파일을 목록으로 보여준다.
데비안 리눅스 배포판에서 패키지 관리를 쉽게하기 위한 명령행 기반의 유틸리티이다.
/etc/atp/sources.list파일에 패키지 관련 정보를 관리하여 의존성과 충돌성을 해결한다. agt-get은 ATP(advanced Tool Packaging) 라이브러리 이용한 명령행 기반의 도구로 어려울 수 있는데 최근에는 GUI기반의 synaptic과 aptitude등을 이용한다.
사용법: apt-get [option] [command] [패키지명]
[option]
-y: 모든 질의에 yes
--purge: remove명령시 환경설정까지 제거한다
[command]
update: 패키지 목록을 갱신한다. /etc/apt/sources.list에서 관련 정보 가져온다.
upgrade: update후에 사용한다. 모든 패키지를 최신 버전으로 갱신한다.
install 패키지명: 패키지 설치시 사용. .deb파일들이 /var/cache/apt/archive에 생성된다.
remove 패키지명: 패키지를 삭제한다.
clean: /var/cache/apt/archive에 생성된 파일을 삭제한다.
리눅스에서 소스 프로그램 설치를 위해서는 1.압축풀기 2.디렉터리이동 3.configure 4.make 5.make install 5단계를 걸친다. 압축도구 tar, GNU C컴파일러인 gcc, 의존성 검사 도구 make 등의 응용 프로그램이 필요하다.
[소스 설치 주요 3단계]
| 설치단계 | 설명 |
|---|---|
| configure | 소스 프로그램의 환경 설정 스크립트이다. tar.gz는 대부분 프로그램 소스인데 환경설정이 필요하다. configure는 사용자들이 자신의 환경에 맞게 손쉽게 수정하도록 제공되는 스크립트이다. Makefile을 만든다 해당 파일은 비소스 파일을 나열하고 다른 파일 참조하는 방법에 대한 정보 |
| make | configure에 의해 변경된 내용을 반영하고 컴파일 작업하여 실행파일 만든다. Makefile을 읽고 소스 코드에서 실행 가능한 프로그램과 라이브러리를 자동으로 빌드하는 자동화 도구이다. 타깃과 의존성 관련 작업을 한 후 실행파일을 만든다 |
| make install | 컴파일된 실행 파일을 지정한 속성으로 지정된 디렉터리에 설치한다 |
make clean configure 작업으로 생성된 파일을 제거한다. configure 재작업하기 전에 실행한다.
소스 컴파일시 사용되는 make 대체 프로그램으로 멀티플랫폼을 지원한다. cmake는 지정한 운영체제에 맞는 make파일을 생성한다.
(ex)mysql은 configure와 make 작업을 cmake로 통합해 설치한다.
[특징]
1. 소프트웨어 빌드를 위한 언어로 독자적인 설정 스크립트를 이용한다.
2. 다양한 플랫폼을 지원한다.
3. C,C++,Java,Fortran에 대해 의존 관계를 분석할 수 있다.
4. SWIG, Qt, FLTK 등을 지원
5. Visual Studio .Net 및 Visual Studio를 지원
6. 이클리스용 빌드 파일 생성 가능
7. 타임스탬프로 파일 내용 변화 알 수 있다.
8. 평행 빌드를 지원
9. 크로스 컴파일 가능
10. Dart, CTest, CPack등을 포함한다.
tar \[option] \[파일명]-C: 디렉터리 변경시 사용
-Z: compress(tar.Z) 관련 옵션
-z: gzip(tar.gz) 관련 옵션
-j: bzip(tar.bz2) 관련 옵션
-J: xz(tar.xz) 관련 옵션
tar cvf posein.tar *c 현 디렉터리에서 .c 파일을 posein.tar파일로 묶는데, 진행사항 출력
tar cf posein.tar posein/ posein디렉터리와 서브 디렉터리의 모든 파일을 posein.tar로 묶는다.
tar rvf posein.tar jalin.txt yuloje.c 현 디렉터리의 jalin.txt와 yuloje.c 파일을 posein.tar파일로 묶는다.
tar tvf posein.tar posein.tar 내용을 보여준다.
tar zcvf posein.tar.gz *.c 현 디렉터리에서 .c로 끝나는 모든 파일을 gzip 압축과 동시에 posein.tar.gz파일로 묶는다.
tar Jxvf php-5.5.4.tar.xz -C /usr/local/src xz로 압축된 php-5.5.4.tar.xz를 /usr/local/src에 푼다.
| 압축률 순서 | 압축 프로그램 | 설명 |
|---|---|---|
| 1 | compress | 예전 유닉스 계열 표준 압출 파일(tar.Z) |
| 2 | gzip | GNU에서 만듬(tar.gz) |
| 3 | bzip2 | 블록정렬 알고리즘과 허브만 부호화를 사용하여 만든 압축프로그램(.bz2) |
| 4 | xz | LZMA2 알고리즘 이용하여 만든 데이터 무손실 압축 프로그램, 최근 공개용 소프트웨어 사이트에서 주로 사용(.xz) |
compress text.txt text.txt는 사라지고 text.txt.Z 압축파일이 생성된다.compress posein.tar posein.tar는 사라지고 posein.tar.Z 압축파일이 생성된다.tar cvf - * | compress > backup.tar.Z 현재 디렉터리 안 모든 파일을 tar로 묶고 compress 압축한다.uncompress -c backup.tar.Z | tar xvf - 압축파일 해제하고 tar로 묶여있는 파일을 현 디렉터리에 푼다.gunzip posein.tar.gz (=gzip -d posein.tar.gz)
gzip -cd yuloje.tar.gz | tar xvf - 압축파일 풀고, tar파일을 현재 디렉터리에 푼다.
zcatgzip 패키지에 같이 들어있는 명령으로 압축되어있는 텍스트 파일 내용을 확인한다.
bzip2,bunzip2(파일명 뒤에 .bz2)
블록정렬 알고리즘과 허브만 부호화를 사용한 압축프로그램. gzip보다 압축률은 좋지만 압축 시간이 더 걸린다.
[option]
-c: 표준 출력으로 지정하는 옵션, 보통 생략하지만 tar 등과 병행해서 사용하면 반드시 표기해야한다.
-d: 압축 풀때 사용
bunzip2 posein.tar.bz2
xz,unxz(파일명 뒤에 .xz)
LZMA2 알고리즘을 이용한 데이터 무손실 압축 프로그램이다. 최근 SW사이트에서 이 압축 포맷으로 파일을 배포하고 있다.
[option]
-c: 표준 출력으로 지정하는 옵션, 보통 생략하지만 tar 등과 병행해서 사용하면 반드시 표기해야한다.
-z: 압축할때 사용(기본이라 불필요)
-d: 압축풀때
zip,unzip(파일명 뒤에 .zip)
주로 DOS/Windows 계열 os가 사용, 리눅스에서도 가능하다.
사용법: zip \[option] 압축파일명 파일명 다른 압축 프로그램과 달리 압축파일명을 기재
[option]
-r: 압축 대상이 dir인 경우 하위 dir을 포함하여 압축
zip posein posein.tar posein.tar를 압축하여 posein.zip 파일이 생성된다.
zip -r backup data/ backup.zip 생긴다.
GNU 프로젝트로 만들어진 컴파일러 모음이다. 다양한 언어를 지원한다.
C컴파일러 도구로서 C언어로 작성한 파일을 gcc로 컴파일하면 a.out이라는 실행파일이 생성된다.
a.out이 PATH에 등록된 디렉터리에 위치하지 않으면 ./a.out으로 실행해야한다.
오브젝트파일을 링커가 링킹해서 실행파일을 만든다
[option]
-o: 실행파일 이름 지정(옵션 없으면 a.out으로 생성)
-c: 링크는 안 하고 목적 파일만 만들어 .o 파일을 만든다.
gcc sum.c sum.c파일 컴파일해서 a.out 실행파일을 생성한다.
gcc -c sum.c sum.c를 컴파일해서 오브젝트 파일을 생성한다. => sum.o로 생성된다.
gcc -o linkedlist linkedlist.c test_linkedlist.c 두 .c파일을 컴파일해서 linkedlist 실행파일을 생성한다.
make는 컴파일을 자동화해주는 도구이다. 소스파일에서 프로그램 실행 파일 및 기타 비소스 파일 생성을 제어한다.
make는 Makefile에서 관련정보를 가져오는데, 해당 파일은 비소스 파일을 나열하고 다른 파일 참조하는 방법에 대한 정보가 기재되어있다. make는 makefile을 토대로 빌드한다.
[option]
-f: makefile 이외에 다른 파일에서 정보를 참조할때

make lin 입력하면 lin 실행파일이 생성된다. (p375 예시 보기)반복적인 코드를 라이브러리 형태로 재사용을 가능케 한다. 사용자의 프로그램과 링크(Link)되어 실행가능한 형태로 완성된다.
(1) 정적 링크 라이브러리와 (2) 동적 링크 라이브러리가 있다.
운영체제에서 주로 동적 링크를 사용하는데 동적으로 링크되어 공유되는 라이브러리를 공유 라이브러리(shared library)라 부른다.
의존성
필요한 라이브러리가 존재하지 않거나 찾을 수 없으면 해당 프로그램은 실행되지 않는다.
링크
동적으로 링크된 실행파일은 실행시 공유 오브젝트에 대한 동적 링커인 ld.so에 의해 검사된다.
동적 링커 ld.so는 실행파일을 점검하고 공유 라이브러리에 대한 의존성 문제를 해결한다.
ld.so가 지정된 라이브러리를 못 찾으면 파일은 실행되지 않는다.
공유 라이브러리는 .so 파일명을 가진다(shared object)
공유 라이브러리는 (1) /lib=> ls,mv와 같은 기본적인 명령어와 시스템과 연관된 라이브러리 (2) /usr/lib => 응용 프로그램과 관련된 라이브러리 에 위치한다.
CentOS 7부터는 x86_64로만 배포되며 대부분 공유 라이브러리 파일을 /lib64안에 둔다.
* /etc/ld.so.conf
기본적인 공유라이브러리(/lib,/usr/lib,/lib64) 이외에 추가로 디렉터리 등록할때 사용하는 환경설정 파일
수정 후 ldconfig 명령 수행해서 내용 갱신 해야한다.
ldconfig
공유 라이브러리 관련 정보 갱신(다시 읽어들여)하고 설정하는 명령(주로 /etc/ld.so.conf 수정후 내용 갱신할때)
[option]
-p: 현재 캐시에 저장된 공유 라이브러리 목록 정보 출력
ldconfig
ldconfig -p
ldd
특정 파일이나 프로그램이 의존하고 있는 공유 라이브러리 정보를 출력
[option]
-v: 관련 라이브러리 정보를 버전 등 자세히 출력(--verbose)
ldd /bin/ls
ldd -v /bin/cp cp 명령어가 의존하는 공유라이브러리 정보를 버전 등과 같이 자세히 출력
특정 프로그램 실행시 라이브러리 등록이 필요하면, 공유 라이브러리 환경 변수 LD_LIBRARY_PATH에 디렉터리 경로를 등록하면 된다.
설정을 지속적으로 유지하고 싶으면 /etc/profile이나 ~/.bash_profile에 등록해야한다.