쉘 학습(2)
리다이렉션
표준 입출력과 표준 오류
- 출력은 두 가지 형식을 포함
- 프로그램의 결과. 즉, 프로그램이 출력하도록 설계한 데이터
- 프로그램이 어떻게 돌아가고 있는지를 말해주는 상태 및 오류 메시지 형식
- I/O 리다이렉션 기능으로 출력과 입력의 방향 변경 가능
표준 출력 재지정
- 화면에 출력하는 대신 다른 파일에 출력하도록 할 수 있음
- 명령어 출력결과를 파일에 저장하는 것이 종종 유용하기 때문
ls -l /usr/bin > ls-output.txt
-
> 리다이렉션 연산자로 출력 방향을 지정할 때, 목적 파일은 항상 처음부터 다시 작성됨
- 이러한 트릭을 이용하여 빈 파일을 만드는 방법
> ls-output.txt
-
>> 리다이렉션 연산자를 사용하여 파일에 이어 쓰기가 가능해짐
표준 오류 재지정
- 표준 오류 재지정할 때는 리다이렉션 연산자가 필요 없음
- 파일 디스크립터를 참조
- 0, 1, 2번 파일 디스크립터
- 순서대로 표준 입력, 표준 출력 , 표준 오류
ls -l /bin/usr 2> le-error.txt
표준 출력과 표준 오류를 한 파일로 재지정
ls -l /bin/usr &> ls-output.txt
- &> 표기가 표준 출력과 표준 오류를 함께 재지정해주는 역할
원치 않는 출력 제거
- /dev/null 이라는 특수한 파일로 출력 방향을 지정함으로써 출력 결과 버릴 수 있음
- 비트 버킷이라고 불리는 시스템 장치로 입력을 받고 아무것도 수행하지 않음
표준 입력 재지정
파일 붙이기
- cat 명령어는 하나 이상의 파일을 읽어 들여서 표준 출력으로 그 내용을 복사
- 주로 짧은 텍스트 파일을 표시하거나, 파일을 하나로 합치는 데에도 사용 가능
[me@linuxbox~] cat
The quick fox jumped.
The quick fox jumped. // CTRL + D 눌러 EOF 문자 입력
[me@linuxbox~] cat > lazy_dog.txt
The quick fox jumped.
// CTRL + D 눌러 EOF 문자 입력
[me@linuxbox~]cat lazy_dog.txt
[me@linuxbox~]cat < lazy_dog.txt
는 똑같은 기능 수행
파이프라인
- command1 | command2를 활용하여 표준 출력을 표준 입력으로 활용 가능
ls -l /usr/bin | less
필터
- 파이프라인은 데이터의 복잡한 연산을 수행할 때 종종 사용
- 하나의 파이프라인에 여러 명령어의 입력이 가능
ls /bin /usr/bin | sort | less
// 두 디렉토리에 있는 실행 프로그램들을 하나의 목록으로 만들어 정렬한 뒤 보여줌
중복줄 제거 및 표시
- uniq 명령어는 종종 sort와 함께 사용
# 중복된 내용을 제거해서 보고자 할 때
ls /bin /usr/bin | sort | uniq | less
# 중복된 내용만 보고자 할 때
ls /bin /usr/bin | sort | uniq -d | less
라인, 단어 개수 및 파일 크기 출력
- wc 명령어는 파일에 들어있는 라인 - 단어 - 파일 크기의 순으로 출력
wc file.txt
- -l 옵션은 라인 수만 보고 싶을 때 사용 가능
# 정렬된 목록의 항목 개수를 알고 싶을 때 사용
ls /bin /usr/bin | sort | uniq | wc -l
패턴과 일치하는 라인 출력
- grep 명령어는 파일 내에서 "패턴"을 만났을 때, 그 패턴을 가지고 있는 라인을 출력
- grep pattern [file...]
ls /bin /usr/bin | sort | uniq | grep zip
- -i 옵션은 검색 수행할 때 대소문자 구분하지 않도록 함
- -v 옵션은 패턴과 일치하지 않는 라인만 출력
파일의 처음/끝 부분 출력
- head, tail 명령어로 첫 / 마지막 10줄 표시 가능
- head(tail) -n #로 그 수 조정 가능
- tail에 -f 옵션 지정하면, 실시간으로 파일 확인 가능
tail -f /var/log/messages
표준 입력에서 데이터 읽고, 표준 출력과 파일에 출력
- tee 프로그램은 표준 입력으로부터 데이터를 읽어서 표준 출력과 하나 이상의 다른 파일에 동시에 출력
- 작업이 진행되고 있을 때, 중간 지점의 파이프라인에 있는 내용을 알고 싶을 때 유용
ls /usr/bin | tee ls.txt | grep zip
확장과 인용
확장
- 쉘은 명령어가 실행되기 직전에 모든 한정 문자들을 한정
- 위 그림에서 쉘은 * 기호를 확장시킨 후, 디렉토리의 이름으로 확장하여 보여주었음
경로명 확장
echo D*
echo *s
echo /usr/*/share
틸드 확장
# 현재 사용자의 홈 디렉토리명
echo ~
# foo 계정의 홈 디렉토리명
echo ~foo
산술 확장
- &((expression)) 으로 산술 확장 사용 가능
echo $(((5**2) *3))
중괄호 확장
- 중괄호 안에 표현된 패턴과 일치하는 다양한 텍스트 문자열 생성 가능
- 위와 같이 정렬된 디렉토리 생성에 아주 유용하게 사용 가능
매개변수 확장
- 매개변수를 확장해서 볼 수 있음
- ex) echo $USER
- 사용 가능한 변수 목록 보기
- printenv | less
명령어 치환
- 명령어 치환으로 명령어의 출력 결과를 확장해서 사용 가능
- ex) echo $(ls)
따옴표 활용(Quoting)
따옴표 기호를 활용하여 원치 않는 확장을 선택적으로 감출 수 있음
쌍 따옴표 기호
- 쌍 따옴표 기호를 이용하여 원치 않는 단어 분할 문제 해결 가능
- 쌍 따옴표가 사용되면, 커맨드라인에서 하나의 명령 인자로 처리
- 첫 번째 입력은 38개의 명령 인자를 가진 명령어로 인식
- 두 번째 입력은 빈칸과 개행 문자 포함하여 하나의 명령 인자로 인식
따옴표 기호
- 모든 확장을 숨겨야 한다면 따옴표 기호 사용
이스케이프 문자
- 종종 선택적으로 확장을 막기 위해 쌍 따옴표 안에서 사용
- 또한 파일명에 있는 어떤 문자가 가진 특별한 의미를 없애고 싶을 때 흔히 사용
고급 키보드 기법
커맨드라인 편집
커서 이동
- CTRL + A: 줄 맨 앞으로 커서 이동
- CTRL + E: 줄 맨 끝으로 커서 이동
- ALT + F: 다음 한 단어로 커서 이동
- ALT + B: 이전 한 단어로 커서 이동
텍스트 수정
- CTRL + T: 현재 커서 위치에 있는 글자와 바로 앞글자의 위치 바꾸기
- ALT + T: 현재 커서 위치에 있는 단어와 바로 앞 단어의 위치 바꾸기
- ALT + L: 현재 커서 위치에 있는 글자부터 그 단어 끝 부분까지 소문자로 바꾸기
- ALT + U: 현재 커서 위치에 있는 글자부터 그 단어 끝 부분까지 대문자로 바꾸기
- CTRL + K: 현재 커서 위치로부터 그 줄 끝 부분까지 텍스트 지우기
- CTRL + U: 현재 커서 위치로부터 그 줄 처음 부분까지 텍스트 지우기
- ALT + D: 현재 커서 위치에서부터 그 단어 끝 부분까지 텍스트 지우기
- ALT + BACKSPACE: 현재 커서 위치에서부터 그 단어 앞부분까지 텍스트 삭제하기
- CTRL + Y: 잘라낸 데이터는 kill-ring이라고 하는 버퍼에 저장되는데, kill-ring에 있는 텍스트를 현재 커서 위치에 삽입
히스토리 활용
- bash는 입력된 명령어에 대한 히스토리를 저장
- 히스토리는 홈 디렉토리에 .bash_history라는 파일로 저장
히스토리 검색
- 기본값으로 bash는 사용자가 입력한 최근 500개의 명령어 저장
- 출력 결과 중 필요한 명령어가 포함된 줄만을 찾을 수도 있음
- 이후 !line_number로 해당 명령어 재실행 가능
- CTRL + R: 역순 증분 검색으로, 현재 커맨드라인에서 히스토리 목록으로 증분 검색
- bash에 명령을 주면 각 글자가 추가될 때마다 우리가 원하는 검색 결과를 골라서 보여줌
- 원하는 결과를 찾으면 CTRL + J를 눌러 현재 커맨드라인에 그 명령어 복사 가능
히스토리 확장
- !!: 마지막 명령어를 반복하여 실행
- !string: 이 문자열로 시작하는 가장 최근에 입력된 항목 실행
- !?string: 이 문자열이 포함된 가장 최근에 입력된 항목을 실행
퍼미션
소유자, 그룹 멤버, 기타 사용자
- id 명령어 통해 자신의 사용자 ID 정보 확인 가능
- 사용자 ID(uid)와 주 그룹 ID(gid) 존재
- 사용자 계정은 /etc/passwd 파일에 정의
- 그룹은 /etc/group 파일에 저으이
- 사용자 계정과 그룹이 생성되면, 이 파일들은 사용자 비밀번호에 관한 정보를 가진 /etc/shadow에 덧붙여 수정
파일 모드 변경
8진법 표현
- 0: --- 1: --x 2: -w- 3: -wx 4: r--
- 5: r-x 6: rw- 7: rwx
기호 표현
-
u: user의 약자로, 파일이나 디렉토리 소유자
-
g: 그룹 소유자
-
o: othres의 약자로, 기타 사용자
-
a: all의 약자로, u,g,o의 조합
-
chmod 기호 표기법 예제
- u+x: 소유자에게 실행 권한 추가
- u-x: 소유자에게 실행 권한 제거
- +x: 모든 사용자에게 실행 권한 추가
- go=rw: 그룹 소유자와 기타 사용자가 읽기, 쓰기 권한을 갖도록 함
기본 권한 설정
- 파일 모드 속성에서 제거할 비트 마스크를 표현하는 umask 설정
- 일반적인 umask의 기본 값은 0002 혹은 0022
사용자 ID 변경
다른 사용자 ID와 그룹 ID로 쉘 실행
- su - 명령어로 슈퍼유저로 쉘 시작 가능
- su -c 'command': 새로운 명령어로 시작하지 않고 단일 명령어 수행 가능
다른 사용자로 명령어 실행
- 사용자는 하나 이상의 지정된 명령어로 제한되고 나머지는 불가
- sudo -l: sudo로 허용된 특권을 확인하기 위한 옵션
- sudo는 슈퍼유저의 비밀번호를 요구하지 않음
파일 소유자와 그룹 변경
- chown [owner][:[group]] file...
- chown 인자 예제
- bob: 파일 소유자를 bob으로 변경
- bob:users: 파일 소유자를 bob으로 변경하고, 파일 그룹 소유자를 users 그룹으로 변경
- :admins: 파일 그룹 소유자만 admins 그룹으로 변경
- bob::파일 소유자가 bob으로 변경되고 그룹 소유자는 bob의 로그인 그룹으로 변경
사용자 비밀번호 변경
- passwd [user] 명령어 통해 자신의 비밀번호 변경 가능
- 슈퍼유저 특권을 가지고 있다면 첫 번째 인자에 사용자 이름을 지정해서 해당 사용자의 비밀번호 설정 가능
프로세스
프로세스는 어떻게 동작하는가
- 시스템이 구동될 때, 커널은 몇몇 프로세스를 초기화하고 init이라는 프로그램 실행
- init은 차례차례 모든 시스템 서비스를 시작하기 위해 init 스크립트라고 불리는 쉘 스크립트 실행
ps 명령어로 프로세스 보기
- 프로세스를 보는 가장 일반적인 명령어는 ps
- tty(teletype): 프로세스용 제어 터미널
- ps aux 명령어로 모든 프로세스를 보여줌
- 프로세스 상태
- R: 실행 상태
- S: 수면 상태
- D: 인터럽트 불가능한 수면 상태
- T: 종료 상태
- Z: 좀비 프로세스
- <: 높은 우선순위 프로세스
- N: 낮은 우선순위 프로세스
- ps 헤더들
- USER: 사용자 ID
- %CPU: CPU 사용량
- %MEM: 메모리 사용량
- VSZ: 가상 메모리 크기
- RSS: 사용 메모리 크기
- START: 프로세스가 시작된 시각
top 명령어로 프로세스 변화 보기
- top 프로그램은 프로세스가 활동순으로 나열된 시스템 프로세스들을 지속적으로 갱신하여 보여줌
- 시스템상의 최상위 프로세스들을 보기 위해 사용
- top 정보 필드
- up 19days: 시스템이 마지막 부팅된 시점부터 지금까지의 시간
- 1 users: 로그인한 사용자의 수
- load average: 평균부하는 실행 대기중인 프로세스 수 의미
- Tasks: 프로세스 수와 프로세스 상태별 수
- 0.0 us: CPU의 0.0%를 사용자 프로세스들이 사용 중
- 0.0 sy: CPU의 0.0%를 시스템(커널) 프로세스에서 사용 중
- 0.0 ni: CPU의 0.0%를 nice 프로세스가 사용 중
- 100.0 id: CPU의 100.0%가 유휴 상태
- 0.0 wa: CPU의 0.0%가 I/O 대기 중
- Mem: 물리메모리 사용현황
- Swap: 스왑 영역(가상 메모리) 사용현황
프로세스를 백그라운드로 전환
- & 기호를 사용하여 프로그램을 백그라운드로 이동 가능
- jobs 명령어는 터미널에 실행 중인 작업을 나열해주는 기능
- jobs에서 지정한 작업 번호(jobspec)을 이용하여 fg로 재전환 가능
- ex) fg %1
프로세스 정지(일시정지)
- 포어그라운드 프로세스를 정지하기 위해서는 CTRL+Z를 누름
- 이후, fg 명령어로 프로그램을 포어그라운드로 복원하거나, bg 명령어로 프로그램을 백그라운드로 이동 가능
- ex) bg %1
시그널
- kill 명령어는 프로세스를 종료하는 것이 아니라, 프로세스에 시그널을 보내는 것
kill로 시그널 보내기
- kill [-signal] PID ...
- 커맨드라인에 지정된 시그널이 없다면, 기본적으로 종료 시그널을 보냄
- 주요 시그널
- 1(HUP): 제어 터미널과 연결이 끊어진 프로그램을 가리키는데 사용
- 2(INT): Interrupt. 터미널에서 CTRL+C 키를 보낸 것과 동일한 기능
- 9(KILL): 커널이 프로세스를 즉시 종료. KILL 시그널은 마지막 수단으로 사용되어야 함(진행 중 작업 저장할 기회가 없음)
- 15(TERM): 프로그램이 시그널을 받을 수 있을 정도로 "살아있다면" 프로그램은 이 시그널을 받고 종료됨
- 18(CONT): STO 시그널로 정지된 프로세스 복원
- 19(STOP): 프로세스를 종료 없이 일시 정지 시킴
- kill 명령어로 프로세스에 시그널을 보내려면 반드시 그 프로세스의 소유자이거나 슈퍼유저여야 함
- 그 외 주요 시그널
- 3(QUIT): Quit. 사용자가 종료 키를 입력하면 커널이 프로세스에 SIGQUIT 시그널 보냄
- 11(SEGV): 프로그램이 잘못된 메모리 사용이 이뤄질 때 보내짐
- 20(TSTP): CTRL+Z를 눌렀을 때 터미널에 의해 보내짐
- 28 (WINCH): 윈도우 크기가 변경된 경우 시스템에 보내짐
- killall로 다수의 프로세스에 시그널을 보낼 수도 있음
- killall [-u user] [-signal] name ...
기타 프로세스 관련 명령어들
- pstree: 프로세스 간의 부모/자식 관계를 보여주는 트리 형태로 정렬해서 프로세스 목록 출력
- vmstat: 메모리, 스왑, 디스크 I/O를 포함한 시스템 자원 사용 현황 출력
- xload: 시간에 따라 시스템 부하를 그래프로 보여주는 그래픽 프로그램
- tload: xload 프로그램과 유사하지만 터미널에서 그래프 보여줌
'Software Convergence > OS, Linux ' 카테고리의 다른 글
2. System Structure & Program Execution (0) | 2018.09.16 |
---|---|
1. Introduction to Operating Systems (0) | 2018.09.16 |
vimtutor 내용 정리 (0) | 2018.09.09 |
Linux Command Line Guide (1) (0) | 2018.09.06 |
sudo 명령어 수행 안되는 경우 (0) | 2018.07.25 |