파이프, 필터, 리다이렉션


오늘은 센토스 리눅스에서 서버를 구축할 때 꼭 알아야 할 필수 개념들과 명령어를 알아보려고 합니다. 


파이프(pipe)


두 개의 프로그램을 연결해 주는 연결통로의 의미

"|" 문자를 사용함


# ls -l /etc/ | more


필터(filter)

필요한 것만 걸려 주는 명령어


grep, tail, wc, sort, grep, awk, sed 등

주로 파이프와 함께 사용


 # ps -ef | grep bash    

--> ps -ef 는 현재 작동중인 프로세스들을 보여주는 명령어, grep 은 bash에 관련된 명령어만 걸러주는 명령어


  # rpm -qa | grep gedit

 --> gedit 관련된 설치 파일만 골라서 보여주는 명령어


리다이렉션(redirection)

표준 입출력의 방향을 바꿔 줄 때 사용하는 명령어


# ls -l 의 결과를 파일로 만들고 싶을 때


# ls -l > file.txt 

라고 적으면 터미널에 해당 결과가 출력되는 게 아니라 file.txt 폴더에 결과가 저장된다. 


# ls -l >> file.txt 


라고 적으면 기존에 file.txt는 유지하고 밑에 덧붙여지게 되는데 

# ls -l > file.txt 라고 적으면 최근의 기록으로 해당 파일이 이미 존재하는 경우 덮어쓰게된다. 


# sort < file.txt > out.txt


sort 는 정렬을 시키는 명령어로 결국 file.txt를 정렬해서 out.txt 파일을 만들어내라는 명령이다. 


이제는 프로세스데몬에 대해서 이해할 차례다.


프로세스란 하드디스크에 저장된 실행코드(프로그램)가 메모리에 로딩되어 활성화된 것을 의미합니다. 

Window OS에서 작업관리자 창을 통해 현재 실행 중인 프로세스를 확인하는데 그 프로세스를 의미합니다. 


포그라운드 프로세스(foreground process)

실행을 하면 화면에 나타나서 사용자와 상호작용을 하는 프로세스로 대부분의 응용프로그램입니다.


백그라운드 프로세스(background process)

실행은 되었지만 화면에는 나타나지 않고 실행이 되는 프로세스로 백신이나 서버 데몬(서비스) 등과 같은 프로그램이 이에 해당합니다. 


각각의 프로세스는 고유한 프로세스 번호를 가집니다.

또한 현재 실행되고 있는 백그라운 프로세스에는 작업번호가 순차적으로 붙게 됩니다. 


# ps -ef 


명령을 통해 현재 실행중인 프로세스를 확인할 수 있으며 프로세스 번호는 실행할 때마다 랜덤된 번호를 부여하므로 프로세스 번호는 계속 바뀌게 된다. 


모든 프로세스는 부모(상위) 프로세스가 있으며 


# ps -ef | grep bash 


에서 


(picture) 

root 60637 60630 0 19:26 pts/0 00:00:00 bash 

에서 60637은 자식프로세스, 60630은 부모프로세스이다. 

자식을 부모에 종속되므로 자식프로세스를 킬(kill)하더라도 부모프로세스는 킬되지 않는다. 


명령어로는


ps

현재 프로세스의 상태를 확인하는 명령어


# ps -ef | grep process_name 


kill

프로세스를 강제로 종료하는 명령어


# kill -9 process_number

# kill process_number --> 역시 강제종료지만 -9 명령어보다 약하다


pstree

부모 프로세스와 자식 프로세스의 관계를 트리 형태로 보여준다


그렇다면 이제 배운 명령어를 가지고 실험을 해보자.

아래 명령어를 입력해서 무한 루프 y를 생성해보자. 중단하려면 Ctrl+C를 누르면 된다.


# yes 

^C(Ctrl+C)

# yes > /dev/null

# ps -ef | grep yes


grep --color=auto 프로세스는 반복되는 프로세스로 무시하면 된다.


# kill -9 64198


포그라운드 -> 백그라운드 -> 포그라운드


아래명령을 다시 실행시킨다음 Ctrl+Z로 일시중지 시키고 명령어 bg를 입력하면 포그라운드에서 돌던 프로세스가 백그라운드에서 돌기 시작한다. 

다시 포그라운드로 돌리려면 fg를 입력하면 된다.


# yes > /dev/null

^Z

[1] + Stopped  yes > /dev/null

# bg

# fg  process_number

^C



# gedit

# gedit  &  


명령어 뒤에 &를 넣으면 백그라운드로 돌린다는 의미이다. 해당 명령어는 명령어를 입력했을 때 포그라운드로 출력물이 보이는 경우에 효과적이다. 

그래서 보통 압축을 할때 (tar 명령) 포그라운드에서 진행 상황을 보지 않고 tar .... & 이라고 입력해서 백그라운드에서 압축을 실행시킬 수 있다. 



이번엔 서비스이다.

서비스는 시스템과 독자적으로 구동되어 제공하는 프로세스를 일컫는다. 예를 들자면 웹 서버(httpd), DB 서버(mysqld), FTP서버(vsftpd) 등이 있다.

실행 및 종료는 대게 


# systemctl start/stop/restart service_name


으로 사용한다

서비스의 실행 스크립트 파일은 /usr/lib/systemd/system/ 디렉터리에 'service_name.service' 라는 이름으로 확인할 수 있다. 예를 들어 웹 서비스는 httpd.service라는 이름의 파일로 존재한다. 


서비스는 항상 가동되지만 소켓이란 것이 있다. 소켓은 외부에서 특정 서비스를 요청할 경우에 systemd가 구동시킨다. 그리고 요청이 끝나면 소켓도 종료된다. 따라서 소켓으로 설정된 서비스를 요청할 때는 처음 연결되는 시간이 앞에서 설명한 서비스에 비교했을 때보다 약간 더 걸릴 수 있다. 왜냐하면 systemd가 서비스를 새로 구동하는 데 시간이 소요되기 때문이다. 이와 같은 소켓의 대표적인 예로 텔넷(Telnet)이 있다. 쉽게 말해 서비스는 항상 가동되어 있어 요청하면 바로 반응하고 소켓은 서비스를 새로 가동시켜야 하기 때문에 반응이 서비스에 비해 느리다. 

예전 centos 에서는 소켓과 비슷한 개념으로 xinetd 데몬이 주로 사용되었다고 하는데 centos 7에 들어와서 여전히 xinetd 데몬을 지원하긴 하지만 많은 서비스들이 xinetd 대신 소켓을 사용하는 추세이다. 


이렇게 오늘은 센토스 리눅스에서 서버를 구축할 때 알아뒀으면 하는 개념들과 명령어에 대해 정리해보았다.

필자도 공부중이지만 모르는 부분은 물어가면서 구글링해가면서 하나씩 배워가는 재미가 쏠쏠한 센토스 리눅스이다. 

+ Recent posts