리다이렉션
리눅스 쉘은 표준입출력을 파일 형태로 열고 있다.
아래와 같은 형태로 항상 동일하게 열고 있다.
- 표준 입력(stdin): 키보드
- 표준 출력(stdout): 모니터
- 표준 에러(stderr): 모니터
기본적으로 프로그램은 연산 결과를 출력 장치(모니터, 파일, 프린터 등)에 내보내는데, 임의로 다른 곳으로 내보낼 수 있도록 하는 것을 리다이렉션이라고 한다.
정확히는 출력 결과를 가져다가 다른 프로그램의 표준 입력으로 내보내는 것을 말한다.
표준 입출력은 파일 형태로 열리는데 리눅스에서 파일이 열리기 위해서는 파일 디스크립터(file discriptor)를 할당받아야 한다.
표준 입력 = 0
표준 출력 = 1
표준 에러 = 2
위와 같이 0, 1, 2로 할당받은 것을 이용해서 리다이렉션을 하게 된다.
> file
표준 출력을 해당 파일로 리다이렉션한다. 파일이 없으면 새로 만들고, 있으면 덮어쓴다.
>> file
표준 출력을 해당 파일로 리다이렉션한다. 파일이 없으면 새로 만들고, 있으면 파일 끝에 덧붙인다.
2>&1
표준 에러를 표준 출력으로 리다이렉션한다. 표준 출력의 방식을 그대로 가져간다.
예) 1>/dev/null | 2>&1 이라고 입력할 경우 표준 출력은 /dev/null에 출력되고 표준 에러는 표준 출력의 방식을 동일하게 가져간다.
/dev/null은 특수 파일로 이 파일에 출력된 데이터는 버려지게 된다.
< file
파일로부터 표준 입력을 받도록 리다이렉션한다.
파일 디스크립터
컴공나오면 뭐하나 전부 까먹는 인간인데..
리다이렉션에 대해 알아보다가 급 파일 디스크립터가 뭐였지..기억이 하나도 안난다... 기억 속에는 표같은거..? 생각난다.
일단 유닉스 시스템에서 모든 것을 파일이라고 한다.. 흔히 우리가 알고 있는 파일부터 디렉토리, 소켓, 파이프 등등 모든 객체들을 파일로 관리한다.
그리고 프로세스가 위와 같은 파일에 접근할 때 파일 디스크립터라는 개념을 이용해서 접근한다.
파일 디스크립터는 파일이나 기타 입출력 리소스에 접근하는데 사용되는 추상 표현이라고 한다.
시스템으로 할당받은 파일이나 소켓을 대표하는 정수이다.
파일 디스크립터는 3번부터 시작인데, 0, 1, 2는 표준 입력, 표준 출력, 표준 에러로 고정 할당되어있다.
프로세스가 유지하고 있는 파일 디스크립터의 테이블 인덱스가 숫자이기 때문에 파일 디스크립터는 숫자를 사용한다.
프로세스가 파일을 열면 커널은 파일 디스크립터가 할당하지 않은 숫자 중 가장 작은 숫자부터 할당한다.
파일 디스크립터는 FD 플래그와 파일 포인터로 이루어져 있다.
그래서, 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근하려고 하면, 파일 디스크립터에서 FD 값을 이용해서 파일을 지칭할 수 있다.
https://twofootdog.tistory.com/51
위의 화면은 참고한 사이트에서 가지고 왔는데..
보면, 0, 1, 2는 표준 입력, 출력, 에러인데 모두 /dev/null로 버린다~~~
이외에 파이프, 소켓 등등 프로세스와 관련된 모든 객체에 대한 접근을 파일 디스크립터를 이용해서 하도록 되어있다.
kill
프로세스를 지정하고 신호(signal)를 보내서 제어하는 명령어이다.
옵션
-9 : 지정된 프로세스에 종료 신호를 보낸다.
-l : 신호(signal)로 사용할 수 있는 신호 목록을 보여준다.
위의 화면은 맥인데, 맥은 좀 불친절하넹..
https://server-talk.tistory.com/432
참고하던 사이트에서 보던 명령어 화면이었는데, 맥은 비교적 불친절하게..나열되어있음..
아무튼 신호 목록을 보여주기 때문에 필요한 것을 골라서 사용하면 된다.
명령어는 아래와 같이 사용하면 된다.
kill -9 [PID]
kill -SIGKILL [PID]
참고 사이트
1. https://code4human.tistory.com/123
2. https://gracefulprograming.tistory.com/100
3. https://twofootdog.tistory.com/51 (파일 디스크립터)
4. https://server-talk.tistory.com/432 (kill 명령어와 신호)