[week1-3] UNIX Command

haeryong·2022년 11월 2일
0

CLI command

- Command Line Interface 명령어. 터미널 명령어를 의미함.

auto completion
Tab키를 사용하면 자동완성, double Tab의 경우 가능한 명령어들을 보여준다.

i18n
internationalization
- UTF-8을 기본 문자세트로 사용하는 시스템들을 의미.

현재 Linux/UNIX command는 i18n에 맞게 만들어져 있다.
- LANG 환경변수 설정의 영향을 받는다.(en_US 로케일 권장)

file 관련 명령어

pwd - print working directory

cd - change directory
/ : 루트 디렉토리
~ : 홈 디렉토리
- : 이전 경로

absolute path
root dir을 시작으로 하는 경로 (e.g. /usr/local/bin)

relative path
현재 디렉토리를 시작으로 하는 경로 (e.g. ../../tmp)

ls - list file

$ ls -al
drwxr-xr-x  5 root     root     4096 Nov  1 20:01 ..
-rw-------  1 haeryong haeryong 7851 Nov  2 10:45 .bash_history
<- mode ->    <-owner:user/group->  <- time  ->    <filename>
		<-links->             <-sizes->         

-로 시작하면 regular file을 의미, d로 시작하면 directory, l로 시작하면 symbolic link

$ ls -a
$ ls -l
$ ls -a -l == ls -al

$ ls -lt
$ ls -ltr
$ ls -li

a : all
l : long
t : sort by mtime
r : reverse

file mode bit : UNIX의 파일 권한을 나타내는 3+9 bit 체계
3bit : SetUID, SetGID, Sticky bit를 의미함.(허가 권한)
9bit : 파일의 owner, group, others의 접근 권한을 의미.

표기방법
- Symbolic mode : "rwx" symbol로 표기하는 방식
- Octal mode : bit를 8진수법으로 표기하는 방식

Octal mode
rwx rwx rwx : 3칸씩 각각 rwx = owner, group, others 파트로 나뉨.
rwxr-x--- == 7(4+2+1) 5(4+1) 0, owner(rwx), group(r-x), others(---)
r : readable / w : writable / x : executable(실행)

symbolic mode rwxr-xr-- == octal mode 7(4+2+1)5(4+1)4(4)

directory의 경우 r : 디렉토리 내부 파일을 볼 수 있음
x : 내부 파일의 내용을 볼 수 있음

directory
디렉토리 생성, 제거

$ mkdir [-p] <directory name>

$ rmdir [-p] <directory name>
디렉토리 내부에 파일이 있을 경우
$ rm -rf

r : recursively
f : force

directory mode bit 바꾸기

$ chmod 664 testdir
$ ls testdir
hello.txt
$ cat testdir/hello.txt
-> permission denied

cp, mv, rm

$ cp ~/.bashrc ~/bashrc_example

$ mv ~/bashrc_example ~/old_bashrc

$ rm ~/old_bashrc

chmod
change mode

chmod 750 direc

chown, chgrp
change owner, change group

root 유저만 가능!

# chown root helloworld; ls -l helloworld

file
파일의 타입 확인(txt인지 동영상인지 등..)

file <file>

stat
파일의 meta data를 출력함.
수식하는 정보(파일이름, 생성시간, 권한 등등..)

stat [option] <file>

- <ALT + .> 이전에 쳤던 명령어의 마지막 인수를 가져옴.

touch
-파일의 메타 정보 업데이트.
- 파일이 존재하지 않는 경우 빈 파일을 생성.

$ touch emptyfile
$ stat emptyfile 

find
조건을 가지고 검색을 할 수 있고, 검색 후 특정 작업을 수행할 수도 있음.

주요 검색조건

-name filename : filename과 이름이 같은 파일을 검색
-size n : 크기가 n인 파일을 검색
-mtime n : 변경된 시간이 n인 파일을 검색
-mmin n : (mtime 옵션은 day, mmin 옵션은 minute)
-inum n : inode number가 n인 파일을 검색
-samefile file : file과 같은 inode를 가진 파일을 검색(=같은 하드링크 검색)
-maxdepth level : 탐색할 위치의 하위 디렉토리 최대 깊이가 level인 파일을 검색(최대 깊이 제한)
-mindepth level : 탐색할 위치의 하위 디렉토리 최소 깊이가 level인 파일을 검색
depth는 option들의 가장 앞에 와야함.

$ mkdir ~/tmp
$ cd !$

용량이 다른 파일들을 생성
$ for i in {8..21}; do dd bs=100000 count=$i \
if=/dev/zero of=./${i}00k.dat; done

이름이 8또는9 + 아무거나 + k.dat인 파일을 찾음.
$ find . -name '[89]*k.dat'

-a : AND 결합(생략가능)
-o : OR 결합
크기가 1메가(0~1메가)인 파일 찾기
$ find . -name '*k.dat' -a -size 1M

사이즈가 1500k ~ 1800k인 파일 찾기
$ find . -name '*k.dat' -size +1500k -size -1800k

최근 1일 이내에 변경된, 사이즈가 1M보다 큰 파일 찾기
$ find . -mtime -1 -size +1M

파일 이름은 quotation marks로 감싸주면 안전하다

find 검색 후 작업지시

find -exec 명령어 \;
find -exec 명령어 +
\; : 하나하나씩 작업
+ : 모두 찾아서 한번에 작업(파일 개수가 많을수록 이쪽이 더 효율적)

예시 : "*.tmp" 파일을 찾아서 지우는 명령

찾은 모든 파일명이 {}에 들어가게 됨.
$ find . -name "*.tmp" -exec rm {} \;
$ find . -name "*.tmp" -exec rm -rf {} \;
$ find . -name "*.tmp" -exec rm -rf {} \+

예시 : 1일 이내에 만들어진 type f(일반파일)을 찾아서 목록을 mtime_b24.txt파일에 저장하기.

$ find . -mtime -1 -type f > mtime_b24.txt

예시: 맥스뎁스 3단계, 조건만족하는 파일을 모두 "~/backup" 디렉터리에 복사하기.

$ find ./ -maxdepth 3 -exec cp {} ~/backup \;

stdio(표준입출력)

standard input / output

file channel : file에 입출력하기 위한 통로
- 파일에 입출력 하기 위한 메타 정보를 가지는 객체(프로세스가 종료되면 사라짐)

file descriptor : 파일 채널들에 붙여진 유일한 식별자(숫자)

예약된 파일서술자
0 : stdin(표준입력)
1 : stdout(표준출력)
2 : stderr(표준에러)
예약된 fd에도 다른 파일을 연결 가능.

fd값은 각 프로세스가 파일을 실행할 때마다 남아있는 가장 작은 숫자를 할당.

PIPE
프로세스 사이에 통신으로 사용
IPC(Inter-Process Communication)의 일종
shell에서도 많이 사용하는 기능.

pipe의 종류

  1. anonymous pipe : temporary(프로세스 종료 시 휘발)
    프로세스들의 직렬 연결, 임시로 생성되었다가 소멸되는 파이프
    보통 파이프라고 하면 익명 파이프를 말함.

명령행에서 (|)로 사용
A | B | C

A의 출력이 B의 입력과 연결, B의 출력이 C의 입력에 연결, C가 종료되면서 최종 결과가 출력됨.

예시

홈 디렉토리의 모든 파일들이 출력됨, 출력의 line 수를 카운트 == 파일 개수를 카운트
$ find ~ | wc -l

wc : word cound , -l 옵션 시 line 수를 카운트함.

  1. named pipe : persistency
    UNIX에서는 named pipe의 구현체를 FIFO Pipe라고 부른다.
    path와 filename이 존재함. path를 가지는 것을 명명되었다고 표현함.
    mkfifo 명령(or POSIX C API)를 사용해 생성.

redirection(방향 재지정)
채널의 방향을 다른 곳으로 연결

A > B : A의 stdout을 파일 B로 연결
ls - a > ls.txt
A < B : A의 stdin을 파일 B로 연결
sort < names.txt
A >> B : append 모드

fd2번인 error출력을 파일로 저장함.

cat
stdout와 파일을 자유롭게 연결해주는 기본 필터

읽기
$ cat ~/.bashrc
쓰기
$ cat > hello.txt
helloworld!
^D

아카이브, 압축 명령어

archive : 보관용 묶음
아카이브 유틸 : tar(tape archive), cpio
tar는 BSD계열, cpio는 SysV계열에서 사용되던 것

tar [ctxv] [f archive-file] files...
c : create
t : test
x : extract
v : verbose(상세정보출력)

f archive-file : 입출력할 아카이브 파일명
--exclude file : 대상중에 file 제외

둘 다 같은 결과
$ tar c *.c > arc_c.tar
$ tar cf arc_c.tar *.c

압축 유틸 : gzip, bzip2, xz, zstd, lz4
압축률 : xz(느림) > bzip2, zstd(빠름) > gzip > lz4

gzip
gzip [-cdflrv] <file..>
-d : 압축해제
-c : stdout으로 결과물을 보냄
-1, -9 : (fast, better) 압축 레벨 지정

압축
tar c /etc/*.conf | gzip -c > etc.tar.gz
해제
gzip -cd etc.tar.gz | tar x

bzip2, xz
옵션은 gzip과 동일

추가 옵션 -T# : 멀티스레드 사용(#에 숫자를 넣음, 0은 자동 판단)

zstd
옵션은 xz와 동일(멀티스레드까지)

추가 옵션 -# : compress level [1-19] (default : 3)

모던 명령어(확장자명을 보고 a(auto)로 파악)
멀티스레드 사용 불가
tar cfa bak_data.tar.xz ./data ./exp
결국 아래와 같이 사용.
tar c ./data ./exp | xz -T0 > bak_data.tar.xz

풀기
tar xfa bak_data.tar.xz
멀티스레드로 풀기
zstd -dcT0 bak_data.tar.zst | tar x

ln : make links

DATA가 저장되면 i-node가 DATA와 연관이 되어있고, i-node를 통해 DATA에 접근할 수 있다.
i-node를 가리키는 link를 통해 파일에서 i-node, DATA에 접근할 수 있다.

i-node
파일마다 고유의 i-node를 1개 가지고 있음.
disk partition(or volume)내에서 유일한 식별자(다른 파티션에 있는 것들 끼리는 구분 불가능)
i-node는 inum이 매겨져 구별됨.
file meta info : 시간 관련 정보, 사이즈, 소유권, 권한 ...

1. hard link : 복제가 가능. Original를 구분할 수 없다. 둘 다 같은 i-node를 가리키고 있음.

same i-node를 가리키므로 동일 파티션 내에서만 생성 가능
regular file만 가능(dir이나 device file 등은 hard link 생성 불가)
실체를 가진 file이다.

$ chmod 775 ~/work/testdir
$ cd ~/work/testdir
$ ls -l
-rw-rw-r-- 1 haeryong haeryong 12 Nov  2 13:24 hello.txt

$ ln hello.txt ../hardlink.txt
$ ls -li
6297891 -rw-rw-r-- 2 haeryong haeryong 12 Nov  2 13:24 hello.txt
hard link의 개수가 1에서 2가 됨

$ ls -li ..
6297891 -rw-rw-r-- 2 haeryong haeryong   12 Nov  2 13:24 hardlink.txt
hello.txt와 hardlink.txt의 inum이 같다 == original을 구분 불가능(둘다 같은 inode를 가리키는 것 뿐)

2. symbolic link(-s option) : 특정 파일의 위치를 가리킴. 단점: 경로만 알 수 있음
symlink
위치(path)만 가리키므로 다른 파티션, 모든 종류의 file에 만들 수 있음.
symlink의 권한은 777

$ ls -l
-rw-rw-r-- 2 haeryong haeryong 12 Nov  2 13:24 hello.txt

$ ln -s ../hardlink.txt symlink.txt
$ ls -l
lrwxrwxrwx 1 haeryong haeryong 15 Nov  2 18:16 symlink.txt -> ../hardlink.txt

원본인 hardlink.txt를 거쳐서 data를 읽어옴.

symlink를 만들 때는 대체로 symlink를 생성할 디렉토리에서 만들거나, r옵션을 추가(-sr)해야 링크가 깨지지 않는다.

which
PATH에 존재하는 파일을 검색

/usr/bin/find

readlink
symlink A가 B를 가리키고, B가 C를 가리키는.. 경우

symlink를 canonical path를 따라 마지막 대상을 파악하는 기능.

마지막 링크를 제외한 링크가 존재할 때 마지막 링크를 확인.

$ readlink -f <symlink>

모든 링크가 존재할 때 성공

$ readlink -e <symlink>

canonicalization
canonical이란 컴퓨터 환경에서 실체를 가지는 standard, official의 의미를 가짐.

{}를 통해 반복 문자열을 줄일 수 있다.

ln -s sym{2,3} 
ln -s sym2 sym3 

Process 관련 명령어

ps

$ ps
  PID TTY          TIME CMD
 2799 pts/0    00:00:00 ps
 4097 pts/0    00:00:00 bash

PID : Process ID
TTY : Terminal ID
TIME : CPU 시간(누적) = CPU를 점유했던 시간의 누적값(현실 시간은 ETIME)
CMD : command = 프로세스 이름 중 첫번째 인수(argv[0]을 의미함)

-e : select all processes(시스템 전체 프로세스)
-a : select all processes except "session leader and processes not associated with a terminal"

-f : full-format

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
haeryong  3507  4097  0 19:25 pts/0    00:00:00 ps -f
haeryong  4097  4087  0 10:46 pts/0    00:00:00 /bin/bash

UID : User ID(해당 프로세스의 소유권자)
PPID : Parent PID(부모 프로세스 ID)
C : CPU 사용량 (CPU time / Elapsed time)*100
STIME : 프로세스를 시작한 시간(hh:mm)

-l : long-format

$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 R  1000  3817  4097  0 104   0 -  7547 -      pts/0    00:00:00 ps
0 S  1000  4097  4087  0  60   0 -  6069 wait   pts/0    00:00:00 bash

F : 프로세스 플래그
S : state code(S = sleep, R = running)
PRI : 실시간 우선순위
NI : 나이스 우선순위(-20~+19 음수일수록 우선순위가 높음)
SZ : 사용되는 프로세스 코어 이미지의 메모리 크기(KB)

$ ps -eo ~~ 주로사용

전체(e)프로세스를 풀 포맷(f)으로 출력한 것들 중 bash가 들어간 행만 출력

$ ps -ef | grep bash
haeryong  4097  4087  0 10:46 pts/0    00:00:00 /bin/bash
haeryong  4531  4097  0 19:35 pts/0    00:00:00 grep --color=auto bash

kill
프로세스에 시그널을 send하는 기능.

kill -l 으로 시그널 리스트 확인

SIGHUP : Hang Up(연결이 끊어졌을 때)
SIGINT : Interrupt <CTRL + C>를 눌렀을 때 발생하는 시그널
SIGQUIT : Quit <CTRL + > core를 dump
SIGKILL : kill(강제로 kill하기 때문에 불안정) 최후의 수단 SIGTERM이 안먹히면 사용
SIGSEGV : Segment violation
SIGTERM : Terminate
SIGTSTP : Temporary stop <CTRL + Z> 잠시 스탑

예시
kill 13011 : PID 13011 프로세스에 SIGTERM 시그널을 보냄
kill -QUIT 13013 : 프로세스에 SIGQUIT 시그널을 보냄
kill -9 13012 : PID 13012에 9번 시그널인 SIGKILL을 보냄.

job control : fore/back-ground process
fore-ground process : 현재 세션에서 제어 터미널을 소유한 프로세스.
back-ground process : 현재 세션에서 제어 터미널을 잃어버린 프로세스.

CTRL - Z : SIGTSTP 시그널을 fore-ground 프로세스에 전달.
-> back-ground에서 Stopped 상태로 있음.

session
멀티유저 시스템에서 통신 객체(seat or remote)를 구별하기 위함.
세션은 제어 터미널(controlling terminal)을 가질 수 있다.
SID와 PID가 같은 프로세스를 Session Leader라고 부른다.
세션 리더는 Process Group leader를 겸한다.
세션 리더로부터 파생된 자식 프로세스(child process)는 모두 같은 세션을 가진다.

제어터미널
사용자의 제어(키보드 입력)을 받는 터미널 장치
CUI(Console User Interface)에서 멀티 태스킹을 위한 제어 방법
제어터미널을 소유한 프로세스는 키보드 입력을 가진다. 이 프로세스를 fore-ground process라 부른다.

규격
pts/# : UNIX98 Pseudo terminal system(1998 SUSv2)
tty# : console terminal

Session에서 제어 터미널을 가지지 않는 경우..
ps의 TTY필드에 숫자가 아닌 ?로 나타난다.

Process Group
프로세스 그룹 리더 : ProcessGroup ID == PID
그룹 리더는 시그널 전파 기능을 가짐.

PID에 -가 붙어있으면 프로세스 그룹에 시그널을 전파하는 것

$ kill -USR1 -14901

daemon
Orphan process (and Session leader) 이고
stdio를 모두 /dev/null로 리다이렉션을 걸고,
control terminal을 가지지 않는 프로세스.

jobs : stopped, back-ground process의 리스트를 출력함.
fg %# : 지정한 process를 fore-ground로 (#에는 jobs의 작업 번호를 지정).
bg %# : 정지된 백그라운드 프로세스를 back-ground에서 running 상태로 변경.
command & : command를 back-ground에서 running상태로 실행시킴.

0개의 댓글