예를 들어 사용자가 HDD(Non-Volatile Memory)와 같은 저장장치에 있는 프로그램을 실행하게 되면
프로그램이 프로세스 상태로 메모리에 적재되어 실행되며, 모든 프로세스는 부모 프로세스, 자식 프로세스로 분류되게 된다.
리눅스에서는 init(~CentOS6), systemd(CentOS7~)와 같은 시스템 최초의 프로세스로 "시스템 초기화 프로세스"라고 불린다.
프로세스 상태 조회에 자주 사용되는 명령어 'ps'를 알아보자
■ 명령어 'ps'의 활용방식
아무런 옵션 없이 사용하게 되면 현재 사용자의 화면에 표기되는 프로세스에 관해서만 보임
▼ 주로 사용되는 옵션은 코드블럭을 참조
ps -f '''현재 실행되는 프로세스에 관해 자세히 출력'''
ps -a '''다른 사용자의 프로세스까지 함께 출력'''
ps -u '''해당 프로세스를 실행중인 사용자의 정보와 시간을 함께 출력'''
ps -x '''백그라운드 프로세스까지 출력'''
ps -aux '''리소스 사용률을 기반으로 프로세스의 상태를 확인'''
ps -ef '''실행중인 모든 프로세스의 상속관계를 기반으로 자세히 확인'''
명령어 'ps'에 옵션 '-aux'를 함께 사용
해당 출력내용의 상단부를 보면 필드별로 나누어진 모습을 볼 수 있는데,
- USER : 프로세스의 소유자
- PID(Process ID) : 프로세스의 번호
- %CPU : 프로세스가 CPU를 차지하는 비율
- %MEM : 프로세스가 메모리를 점유하는 비율
- VSZ(Virtual Set siZe) : 프로세스에 할당된 가상 메모리의 크기
- RSS(Resident Set Size) : 프로세스가 현재 사용하는 메모리 비율
- STAT : 프로세스의 상태
- START : 프로세스가 시작된 시간
- TIME : 프로세스의 총 실행 시간
- COMMAND : 프로세스를 실행시킨 명령
▶ 프로세스의 상태(status)를 알려주는 필드 'STAT' 값의 의미
- R(Run/Runable) : 프로세스가 실행중 또는 실행가능
- D(in Disk wait) : 입출력이 완료될 때까지 깨울 수 없는 상태(수면상태)
-S(Sleeping) : 대기 중, 수면상태(전환 가능한 상태)
-T(sTopped) : 외부 시그널로 인해 일시 정지된 상태
-Z(Zombie) : 부모 프로세스가 종료 시그널을 정상적으로 수신 못해, 수습되지 않고 남은 상태
- < : 우선순위가 높은 프로세스
- N : 우선순위가 낮은 프로세스
- I(Idle) : 유휴(쉬고있는) 프로세스
명령어 'ps'에 옵션 '-ef'를 함께 사용
'-aux' 옵션을 사용했을 때와는 필드에 중복되지 않는 새로운 정보가 표기되는 것을 확인할 수 있다.
이루어지지만, 콘솔창에서는useradd, adduser [password] ... 등의 간단한 명령어와 함께
원한다면 생성과 동시에 사용자의 비밀번호를 설정해줄 수도 있다.
이번 포스트에서는 전반적으로 서비스에 관련된명령어에 대해 알아보려 한다.
** 당연히 운영체제마다 명령어는 상이할 수 있다..
(필자는 리눅스 CentOS7 / Ubuntu18.04 기준)
● 명령어 netstat(network statistics) / ss(socket statistics)
네트워크의 소켓상태 및 라우팅 테이블 등을 모니터링할 때 사용되는 명령어로
각종 서비스 시작 및 방화벽 설정 .. 등 네트워크 관련된 작업을 실행할 때 주로 사용된다.
'netstat'의 경우 'net-tools' 패키지에 포함된 명령어이고, 'ss'의 경우 'iproute2' 패키지에 포함 되어있는데
버전마다 다르겠지만, 운영체제 설치 시 비교적 최신버전의 배포판에서
명령어 'ss'는 추가적인 패키지 설치 없이 사용이 가능한걸로 알고있다.
사용법으로는 netstat / ss [옵션] 식의 구성으로 사용된다.
** 현재는 'netstat'보다는 'ss'의 사용을 권장한다고 한다.
[centos@localhost centos]$ ss -nltp # ss 명령어로 네트워크 상태를 모니터링
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:* users:(("rpcbind",pid=746,fd=8))
LISTEN 0 128 *:20048 *:* users:(("rpc.mountd",pid=1251,fd=8))
LISTEN 0 5 192.168.122.1:53 *:* users:(("dnsmasq",pid=1558,fd=6))
LISTEN 0 128 *:36597 *:* users:(("rpc.statd",pid=1231,fd=9))
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1225,fd=3))
LISTEN 0 128 127.0.0.1:631 *:* users:(("cupsd",pid=1229,fd=11))
[centos@localhost centos]$ netstat -nltp # netstat 명령어로 네트워크 상태를 모니터링
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 746/rpcbind
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 1251/rpc.mountd
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1558/dnsmasq
tcp 0 0 0.0.0.0:36597 0.0.0.0:* LISTEN 1231/rpc.statd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1225/sshd
필자 기준으로 많이 사용되는 '-nltp(LISTEN 상태의 소켓, 포트의 상태와 프레세스 정보)'옵션으로
두 명령어의 출력 내용을 비교해보았다. 이렇게만 보면 차이점이 크게 있어보이지는 않는다.
대표적인 장점으로는 'netstat' 보다는 'ss"가 정보를 불러오는 속도가 빠르다는 점이 있다고 한다.
** 추가적인 정보를 알게되면 수정하여 포스팅하겠읍니다..
● 명령어 head / tail
단어에서 의미하는 바와 같이 어느 파일의 head(머리 부분, 위 부분), tail(꼬리 부분, 아래 부분)
의 일부분(기본 값 : 10 줄)을 출력해주는 역할을 해주는 명령어이다.
기본 값이 아닌 옵션을 이용해 원하는 만큼의 라인 출력도 가능하다.
주로 무거운 파일이나 실시간으로 로그(log)를 확인하려 할 때 사용된다.
사용방법으로는 head / tail [옵션] [파일] 식의 구성으로 사용된다.
[centos@localhost centos]$ head Line.txt # 옵션없이 Default 값으로 앞에서부터 10줄 까지 출력됨을 확인
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
[centos@localhost centos]$ tail -5 Line.txt # -5 옵션으로 뒤에서부터 5줄 까지만 출력
Line 16
Line 17
Line 18
Line 19
Line 20
' tail -f ' 옵션으로 secure log를 실시간으로 출력됨을 확인
● 명령어 systemctl ~ / service ~
리눅스 시스템에서 각종 서비스들을 관리할 수 있게 해주는 중요한 명령어이다.
~ CentOS6 까지는 service ~ 로 시작하는 명령어가 주로 사용되었지만,
CentOS7 부터는 시스템 부팅 프로세스가 init이 아닌 systemd로 넘어오게 되면서
systemctl ~ 명령어로 변경되었다. 동작방식은 거의 동일하며 현재 CentOS7 에서도
service ~ 명령어가 작동하지 않는 건 아니다.
'systemctl status [서비스]' 명령어를 이용한 각종 서비스의 현재상태(status)를 확인
systemctl start [Service] # 서비스를 시작
systemctl stop [Service] # 서비스를 중지
systemctl restart [Service] # 서비스 재시작
systemctl enable [Service] # 부팅 시 서비스 시작
systemctl disable [Service] # 부팅 시 서비스 자동시작 x
### systemctl enable / disable의 경우 ~CentOS6.x에서의 chkconfig와 호환되는 명령어이다.
● 명령어 ps / pstree / top(process status)
명령어 ps / pstree / top의 경우 각기 다른 정보와 형식으로 실행중인 프로세스의 상태를 보여준다.
우리가 주로 사용하는 Winodws System에서의 "작업 관리자"에서 프로세스의 상태를
확인할 수 있듯이 Linux System에서는 위에 해당하는 명령어로 프로세스의 상태를 확인할 수 있다
'ps' 명령어에서 주로 사용되는 '-ef' 옵션을 이용한모습 (BSD, System V 계열의 옵션이 별도로 지정되어 있음)
● UID : 해당 프로세스의 소유자 USER의 ID를 표시
● PID : 해당 프로세스의 번호를 표시
● PPID : 해당 프로세스의 Parents(부모) PID를 표시
● C : 정의는 짧은 기간 동안의 CPU 사용률이라고 되어있지만, 쓰임새를 자세히는 모르겠다..(아는 분께서는 댓글을..)
● STIME : 프로세스가 시작된 시간을 표시
● TTY : 프로세스와 연결된 터미널을 표시
● TIME : 해당 프로세으의 총 CPU 사용시간을 표시
● CMD : 해당 프로세스의 실행 명령행을 표시
전개도 형식으로 프로세스를 보여주는 'pstree'명령어에 '-p' 옵션을 사용해 프로세스의 PID를 확인가능
** 모든 프로세스를 관리하는 최초의 프로세스 "systemd"로 부터 다른 프로세스들이 생성됨을 직관적으로 확인할 수 있다.
명령어 'top'으로 프로세스와 CPU, RAM의 상태를 한 눈에 확인가능
** 실행을 원치않는 프로세스를 'kill'할 수도 있고 몇 가지 키 조합을 통해서 표시를 원하는
우리가 Linux 시스템을 사용함에 있어서 다양하고 많은 명령어의 사용법을 익혀둔다면 보다 편리하고 빠른 작업이 가능하게 해준다. 특히나 우리가 흔하게 접해볼 수 있는 운영체제인 MacOS, Windows ... 등의 운영체제들은 사용자의 편의성을 고려해 GUI(Graphic User Interface)를 주로 사용하기 때문에 마우스와 함께 작업을 진행할 수 있지만, 실제 서버를 운영하거나 관리할 때에는 CUI/CLI(Command User Interface / Comman Line Interface)를 리소스의 소모가 적고 반응이 빠르다는 대표적인 이유로인해 사용하고 있기 때문에 Linux 시스템에서 자주 사용되는 명령어들에 관해서는 알아둘 필요가 있겠다.
(물론 다른 운영체제들도 검은색 배경의 Console에서 명령어 기반의 작업이 가능하다.) ** 필자는 아직 서버운영에 대한 경력이 전무하기에 실무에서는 어떤방식의 작업이 이뤄지는지 정확하게 서술은 할 수 없다...
● 명령어 ls(list segments)
리눅스에서 가장 많이 쓰이는 명령어로 해당하는 디렉터리나 파일의 정보를 표준출력으로 출력해주는 명령어이다. 코드럭에 기재된 옵션들의 조합 외에도 좀 더 다양한 조합으로 명령어의 시너지를 볼 수도 있다.
** Asterisk : 문자 * 를 이용하면 ls *.txt, a* ... 등의 와일드카드 또한 활용이 가능하다.
ls #list segments
### <Option> ###
ls -a # 디렉터리 내의 숨김파일/디렉터리까지 출력해주는 옵션
ls -l # 파일의 정보를 "자세히" 출력, 권한, 소유자, 파일명 ...등
ls -h # 숫자로만 표기가 아닌, K,M,G 등의 단위로 파일의 크기를 출력
### <Option> ###
ls -la # 숨김파일과 함께 자세히 출력
ls -ld # 디렉토리만 지정하여 자세히 출력
● 명령어 mv(move)
파일명의 변경과 파일의 위치를 변경해줄 수 있는 명령어이다. mv의 경우 같은 mv [옵션] [대상파일] [목적파일] 식의 구성으로 사용되는데, 코드블럭을 보며 이해해보자 ** 명령어 "rename"의 경우 파일의 확장자를 일괄적으로 변경할 때 사용된다.
mv # move
### <Example> ###
# $PATH = /home/user/
mv ./A_file ./B_file # 같은 미디어/볼륨 안에서의 mv 명령어는 이름을 변경해주는 기능
### <Example> ###
mv /home/user_1/A_file /home/user_2/B_file # 식의 이용은 위치를 변경, 이름 또한 변경이 가능하게 해준다
● 명령어 cp(copy)
파일이나 디렉토리를 복사할 때 사용되는 명령어로 우리가 Windows에서 흔히 사용하는 "복사, 붙여넣기"의 기능과 동일하게 생각하면 될 것 같다. cp의 경우 cp [옵션] [대상 파일/디렉토리] [목적지] 식의 구성으로 사용된다.
cp # copy
### <Example> ###
cp -R [A_Directory / File] [B_Directory] # 하위 디렉토리의 파일, 디렉토리를 전부복사
cp -a [A_Directory / File] [B_Directory/"file_name"] # 원본파일의 속성과 링크를 포함하여 복사를 하는 경우이며, 저장될 위치에서의 이름지정도 가능
cp -v [A_Directory / File] [B_Directory] # 복사가 진행되는 과정을 표시해주는 옵션
### <Example> ###
cp -arp [A_Directory / File] [B_Directory] # 속성, 소유자, 권한 등 원본파일의 모든 부분을 동일하게 복사하는 경우에 사용
● 명령어 cd(change directory) / pwd(print working directory)
우리가 검은색 배경의 콘솔창에서 작업을 하면서 많이 사용하게 되는, 작업 위치에 관련된 명령어이다. 대부분의 실무자들은 우리가 워드나 엑셀파일을 작업하면서 "Ctrl + S" 를 누르며 수시로 파일을 저장하는 행위와 비슷하게 수행하는 일종의 습관(?)이라고 말 하기도 한다. cd 의 경우 cd [디렉토리] 식의 구성으로 사용된다. 절대경로 위치지정 외에도 상대경로 위치지정도 가능한데 몇 가지 예시를 확인해보자
● . : 현재 디렉토리를 의미 ● .. : 한 단계(?) 상위 디렉토리를 의미 ● ~ : "user"의 홈 디렉토리를 의미 ---> 식의 표현으로 상대경로 지정이 가능하다. 하지만 예외의 경우는 언제나 존재하기 때문에 중요한 작업을 수행한다면 안정성의 이유로 절대경로의 사용을 지향한다고 한다.
cd # change directory
pwd # print working directory
### <Example> ###
# $PATH = /home/user
~$ pwd # 현재 작업 위치를 확인
/home/user # /home/user 디렉토리에서 작업하고 있음을 확인가능
~$ cd /home # 절대경로를 지정하여 현재위치 /home/user 위치에서 상위 디렉토리인 /home 디렉토리로 위치를 변경
~$ pwd # 현재 작업위치를 확인
/home # cd 명령어로 위치가 변경되어 /home 으로 위치가 변경되었음을 확인
● 명령어 cat(concatenate)
명령어 "cat"은 인터넷 사전에 정의되어 있는 바에 의하면, 표준 입력을 표준 출력으로이어주는(concatenate) 역할을 하는 명령어라고 서술 되어있다. 주로 길이가 짧은 파일의 내용을 간편하게 보고싶을 때 사용되거나, 재지정(Redirect)을 활용하여 파일을 파일을 복사해주거나 합쳐주는 등의 작업을 수행할 때 사용된다. ** Redirect == <, <<, >, >> 등의 부호를 이용 ** Pipe == "|" 부호를 이용 cat 의 사용법으로는 cat [옵션] [파일] 식의 구성으로 사용되며, 주 사용방식은 코드블럭에 표현 해보았다.
cat # concatenate
### <Example> ###
cat File.txt # 단일 파일의 내용을 출력
cat File1.txt File2.txt File3.txt # 복수 개의 파일의 내용을 한 번에 출력
cat -n File.txt # 행 번호를 표시하여 파일의 내용을 출력
cat File1.txt File2.txt File3.txt > New_File.txt # 복수 개의 파일의 내용을 새로운 파일의 내용으로 출력 후 저장
이번 포스트에는 리눅스를 사용하며 거의 필수적으로 많이 사용되는 명령어 몇 가지를 간단하게 알아보았다. 다음 포스트에서는 서버를 운영할 때 주로 사용되는 명령어와 다중 명령어에 대하여 글을 써보도록 하겠다.