[LFCS] Redirection, Pipe, File Descriptor

2022. 8. 1. 21:10[ 자격증 ]/[ LFCS ]

Linux Redirection

일반적으로 커맨드로 실행되는 프로세스는 표준 입력 스트림(standard input stream), 표준 출력 스트림(standard output stream)과 오류 출력 스트림(standard error stream)을 가지고 있다. 총 하나의 입력 스트림과 두 개의 출력 스트림을 가지고 있는 것이다 기본적으로 이 모든 스트림은 일반적인 문자열로 콘솔에 출력하게 되어 있다.

 

리다이렉션은 스트림의 흐름을 바꿔준다. 실행된 프로세스(커맨드)의 스트림을 콘솔이 아닌 '파일'로 사용하고 싶다면 리다이렉션을 사용하면 된다. 이때 사용되는 기호가 < 또는 >>> 이다. 

 

 

파일 디스크립터(file descriptor)

파일은 읽거나 쓰기 전에 반드시 열어야(open) 한다. 커널은 '파일 테이블이'라고 하는 테이블을 이용해 프로세스 별로 열린 파일 목록을 관리한다. 파일 테이블의 각 항목은 열린 파일에 대한 정보를 담고 있으며, 각종 메타데이터가 포함되어 있다. 

 

파일 디스크립터(fd)는 프로세스가 파일에 접근하기 위해 사용되는 '고유 식별자'이다. 참고로 리눅스 시스템의 모든 것은 파일로 구성되어 있다. 위에서 언급한 표준 입출력 또한 파일로 관리되며, 소켓, 다양한 디바이스 등도 모두 '파일'로 간주된다. 프로세스는 특정 파일에 접근하기 위해 해당 파일의 디스크립터를 이용하여 접근한다. 예를 들어, 특정 파일에 접근하거나 새로운 파일을 만들면 커널은 프로세스에게 파일 디스크립터를 사용하지 않는 양수 값으로 할당한다. 그리고 커널은 사용되고 있는 파일의 디스크립터를 위에서 언급한 '파일 테이블'로 관리한다. 일반적으로 위에서 언급한 입력 스트림, 출력 스트림은 각각 fd 0번과 1번으로 표현된다.

 

 

리다이렉션 기호

종류 기호 사용법 설명
표준 출력(덮어쓰기) > 명령어 > 파일 명령어의 표준 출력 스트림의 도착 지점을 파일로 설정(기존내용 제거)
표준 출력(append) >> 명령어 >> 파일 명령어의 표준 출력 스트림의 도착 지점을 파일로 설정(내용 추가)
표준 입력 < 명령어 < 파일 파일로부터 입력 받음

 

 

 

 

표준 출력 실습

 

 

표준 입력 실습

 

표준 에러를 표준 출력으로 Redirection

/test.sh >> /tmp/temp.log 2>&1

2>&1 : 에러가 발생하면(2) 표준 출력(1)으로 내보낸다. 기본적으로 >>또는 > 는 표준 출력인데, test.sh가 실행되다가 발생하는 에러를 표준 '출력'으로 바뀌어서 들어오게 하기 위해 2>&1을 사용했다.

 

 


 

파이프(pipe)

프로세스 간 통신 기법(IPC) 중 하나인 '파이프'를 통해 특정 커맨드(프로세스)의 결과를 다른 커맨드(프로세스)의 입력으로 내보낼 수 있다. 파이프는 기호 | 를 사용하며 일반적으로 '프로세스 A | 프로세스 B'와 같은 커맨드로 사용한다. 여기서 프로세스 A의 '표준 출력'을 프로세스 B의 '표준 입력'으로 사용한다는 의미이다.

 

 

예시

ps -ef | grep sshd

위 결과는 ps 프로세스의 출력 결과(표준 출력)를 그대로 파이프를 통하게 하여 grep 프로세스의 표준 입력으로 넣어주는 것을 의미한다.

 

 

cf. 리다이렉션 + 파이프

ps -ef | grep sshd > ps_sshd.txt

위 결과는 ps의 결과를 grep으로 넣고 그 결과(표준 출력)를 ps_sshd.txt 파일로 저장하는 과정이다.

 

 

 


 

 

cf. lsof (list open files)

열려있는 모든 파일과, 그 파일들을 열고 있는 프로세스들의 목록을 출력하기 위한 용도로 사용된다. 여기서 파일이란 디스크 파일, pipe, socket 등이 해당되며 이들은 각각 fd를 가진다.

 

 

lsof -p <pid> : 특정 프로세스가 사용중인 열린 파일

lsof pu <username> : 특정 유저가 사용중인 열린 파일

lsof -u^root -u ^ubuntu : root유저와 ubuntu유저가 사용하고 있지 않은 열린 파일

lsof [file path] : 특정 파일을 오픈한 모든 프로세스 

sof +D [dir] : 특정 디렉토리에서 열려 있는 파일 목록

lsof -i TCP : 열려있는 TCP포트(소켓) 확인

lsof -i TCP:22 : 22번 포트로 연결한 모든 프로세스

lsof -i TCP:1024-2048 : TCP포트 1024 ~ 2048번을 열고 있는 모든 프로세스 정보

 

 

 

 

Reference

- https://www.lesstif.com/system-admin/lsof-20776078.html