Linux
- 서버에서 자주 사용하는 OS로, 안정성 및 신뢰성이 높다.
- 쉘 커맨드/스크립트는 자주 쓰는 것 위주로 학습하고, 필요한 코드는 구글링하자.
Shell
= 사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 터미널/콘솔
- sh: 최초의 쉘
- bash: Linux 표준 쉘
- zsh: Mac OS 카탈리나 이후 기본 쉘
Shell Commands
man
- Shell Command의 매뉴얼 문서를 보고 싶은 경우
- e.g.
man python3
mkdir
- MaKe DIRectory; 새 폴더 생성
- e.g.
mkdir beaver
ls
- List Segments; 폴더 내 파일 목록을 출력
- -a
all; 전체 파일 출력
- -l
long; 권한, 소유자, 생성일, 용량 등을 길게 출력
- -h
human-readable; 사람이 읽기 쉽도록 용량을 GB, MB 등 표현
- e.g.
ls
/ ls ~
/ ls -al
/ ls -lh
pwd
- Print Working Directory; 현재 폴더 경로를 절대 경로로 보여줌
- e.g.
pwd
cd
- Change Directory; 폴더 이동하기
- e.g.
cd beaver
echo
- 터미널에 텍스트 출력 (Python의 print와 유사)
- e.g.
echo "hi"
- echo `command`: command 결과 출력
- e.g.
echo `pwd`
cp
- CoPy; 파일 또는 폴더 복사
- -r
recursive; 폴더 복사 시, 폴더 안에 파일이 있으면 재귀적으로 모두 복사
- -f
force; 강제로 복사
- e.g.
cp beaver1.zip beaver2.zip
vi
- vim 편집기로 파일 생성 및 수정
- e.g.
vi beaver.sh
i
(Insert Mode)
ESC
(Command Mode)
:
(Last Line Mode)
현재 파일명으로 저장
- q: 종료(저장 X)
- q!: 강제 종료(! = 강제)
- wq: 저장 후 종료
- /문자: 문자 탐색 (n = 계속 탐색)
- set nu: vi 라인 번호 출력
- 삭제
- dd: 현재 줄 삭제
- x: 커서 위치의 글자 1개 삭제 (5x: 글자 5개 삭제)
- 복사
- yy: 현재 줄 복사
- p: 현재 줄 바로 아래에 붙여넣기
- 이동
- k: 위 / j: 아래 / h: 왼쪽 / l: 오른쪽 (혹은 방향키로 이동)
bash
- Shell Script 실행
- e.g.
bash beaver.sh
sudo
- SUperuser DO; 커맨드를 슈퍼 유저(최고 권한, 관리자 권한)으로 실행
- e.g.
sudo rm 1.sh
mv
- MoVe; 파일 또는 폴더 이동 or 이름 변경
- e.g.
mv beaver1.sh beaver2.sh
cat
- conCATenate; 특정 파일 내용 출력
- 여러 파일을 인자로 주면 합쳐서(concat) 출력
- e.g. cat beaver1.sh beaver2.sh
- 파일에 저장(OVERWRITE)하고 싶은 경우
- e.g. cat beaver1.sh beaver2.sh **>** beaver3.sh
- 파일에 추가(APPEND)하고 싶은 경우
- e.g. cat beaver1.sh beaver2.sh **>>** beaver3.sh
clear
history
- 최근에 입력한 쉘 커맨드 history 출력
!숫자
: 해당 커맨드 재이용 가능
- e.g.
history
-> !1004
find
- 파일 및 디렉토리를 검색할 때 사용
find -name "file"
: 현재 폴더에서, file이라는 이름을 가지는 파일 및 폴더 검색
export
- 환경 변수를 설정할 때 사용
- e.g.
export water="물"
// 주의: 띄어쓰면 안됨. Shell에선 붙여서 써야 함.)
echo $water
// "물" 출력
- 주의:
export
로 환경 변수를 설정한 경우, 터미널이 꺼지면 사라지게 됨.
- 환경 변수를 영구적으로 저장하고 싶다면
.bashrc
, .zshrc
(Shell에 따라 다름)에 저장
- e.g.
vi ~/.zshrc
실행 -> 맨 마지막 줄에 export water="물"
입력-> :wq
로 저장
-> 이후 재로그인 하거나 source ~/zshrc
사용 시 적용 완료
alias
- 기본 명령어의 별칭 설정 가능
- 터미널에
alias
입력 시 현재 설정된 별칭 확인 가능
- e.g.
alias ll2='ls -l'
tree
- 설치 필요:
apt-get install tree
- 폴더의 하위 구조를 계층적으로 표현 -> 폴더 구조 설명에 유용
- e.g.
tree -L 2
: 2단계까지 보여줌
head, tail
- 파일의 앞/뒤 n행 출력
- pandas.DataFrame의 head, tail과 유사
- e.g. head -n 3 beaver.sh
sort
- 행 단위 정렬
- -r
내림차순 정렬(default: 오름차순)
- -n
Numeric Sort(숫자 정렬)
- e.g.
cat fruits.txt | sort -r
// fruits.txt의 결과를 내림차순 정렬
uniq
- 중복된 행이 연속으로 있는 경우 중복 제거
sort
와 함께 사용 가능
- e.g.
cat fruits.txt | uniq
- e.g.
cat fruits.txt | sort | uniq | wc -l
// 중복 제거한 결과가 몇 줄인지 출력
grep
- 파일에 주어진 패턴 목록과 매칭되는 라인 검색
-grep 옵션 패턴 파일명
- -i
대소문자 구분 없이 찾기
- -w
정확히 그 단어만 찾기
- -v
특정 패턴 제외한 결과 출력
- -E
정규 표현식 사용
cut
- 파일에서 특정 필드 추출
- -f
잘라낼 필드 지정
- -d
필드 구분자 (default: \t)
awk
- 텍스트 처리 도구
awk 'pattern {action}' input_file
- pattern
특정 패턴을 지정
- action
선택된 줄에 대해 수행할 동작
- $1, $2
첫번째 필드, 두번째 필드
- -F
구분자
- e.g.
awk -F: '{print $1}' cut_file
Redirection & Pipe
표준 스트림(Stream)
![[Pasted image 20240911040753.png]]
- Unix에서 동작하는 프로그램은 커맨드 실행 시 3개의 stream 생성
- stdin: 0으로 표현, 입력
- stdout: 1로 표현, 출력
- stderr: 2로 표현, 디버깅 정보 or 에러
Redirection
- 프로그램의 출력(stdout)을 다른 파일이나 스트림에 전달
: 덮어쓰기(Overwite); 파일이 없으면 생성 및 저장
: 맨 아래에 추가(Append)
- e.g.
echo "hi" > test.sh // test.sh 생성해 "hi" 저장(Overwrite)
echo "bye" > test.sh // test.sh의 맨 아래에 "bye" 추가(Append)
python train.py > log_file 2>&1 & // 에러 메시지가 log_file에 저장됨
// 2>&!: 표준 에러(stderr, 2)를 표준 출력(stdout, 1)으로 redirect
// &:백그라운드에서 실행
Pipe
- 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용하고 싶은 경우
- A의 Output을 B의 Input으로 사용
- e.g. ls | grep "vi" > output.txt // 현재 폴더에서, 파일명에 vi가 들어간 파일 찾아 output.txt에 저장
- e.g. history | grep "echo" // 최근 입력한 커맨드 중 echo가 들어간 명령어 찾기
서버에서 자주 쓰는 쉘 커맨드
ps
- Process Status; 현재 실행되고 있는 프로세스 출력
- 실행 중인 PID(Process ID)를 찾기 위해 사용
- -e: 모든 프로세스
- -f: full format으로 자세히 보여줌
curl
-
Client URL; Command Line 기반의 Data Transfer 커맨드
-
Request를 테스트할 수 있는 명령어
-
e.g. curl -X localhost:5000/ {data}
-
웹 서버 작성 후 요청이 제대로 실행되는지 확인 가능
-
더 가독성있게 출력하는 httpie도 있음
-
회사에선 Postman도 활용
df
- Disk Free; 현재 사용 중인 디스크 용량 확인
- -h: 사람이 읽기 쉬운 형태로 출력
- 실제 현업에서 Disk 용량이 100% 차서 서비스가 멈추는 경우가 있음.
ssh
- 안전하게(데이터가 모두 암호화) 원격으로 컴퓨터에 접속하고 명령을 실행할 수 있는 프로토콜
- ssh port: 22
- ssh 사용 이유
1. 보안
- 클라이언트/서버의 통신을 암호화해서 데이터를 안전하게 전송
- 도청과 같은 보안 위협으로부터 데이터 보호
2. 원격 접속
- 물리적으로 떨어진 서버(예: 서버실, 클라우드 서버)에 접속 가능
3. 터널링(포트 포워딩) 기능
- e.g.
usage: ssh -i /path/to/private-key.pem username@hostname(ip) -p 포트번호
ssh -i beaver.pem root@okcomputer -p 30952
// beaver.pem Key를 사용해 okcomputer의 30952 포트에 root로 접속
- ssh의 터널링
- 터널링 = 방화벽 등으로 인해 직접 접근이 제한될 경우, 안전한 터널을 통해
- ![[Pasted image 20240911045523.png]]
- e.g. ssh -L 8080:localhost:30952 사용자명@ssh_서버
scp
- Secure Copy; SSH를 이용해 네트워크로 연결된 호스트 간 파일 전송
- -r: 재귀적으로 복사
- -P: ssh 포트 지정
- -i: ssh 설정을 활용해 실행
- (local => remote) scp local_path user@ip:remote_directory
- (remote => local) scp user@ip:remote_directory local_path
- (remote=>remote) scp user@ip:remote_directory user2@ip2:target_remote_directory
nohup
- 터미널 종료 후에도 계속 작업이 유지되도록 실행 (백그라운드 실행)
- e.g. nohup python3 app.py &
- nohup으로 실행된 파일은 permission이 755여야 함
- 종료: ps ef | grep app .py -> pid 찾은 후 kill -9 pid
- 로그는 nohup.out에 저장됨
- nohup 외에 screen이란 도구도 있음
chmod
- Change Mode; 파일의 권한 변경
- Unix에서 파일이나 폴더의 시스템 모드를 변경
- ls -al(혹은 ll)로 권한 확인 가능
- 소유자 / 그룹 / 기타 사용자
- r: read(읽기), 4
- w: write(쓰기), 2
- x: excute(실행), 1
- -: denied
- e.g. chmod 755 beaver.sh // 파일의 permision을 755로 변경
- 755 = rwx r-x r-x // 소유자 7, 그룹 5, 기타 사용자 5
python
Shell Script
-
Shell Command의 조합
-
.sh
파일에 생성, bash [filename].sh
로 실행
-
#!/bin/bash
Shebang; 이 스크립트를 Bash shell로 해석
-
인자
- $1, $2, $3
: 1, 2, 3번째 인수를 참조
- $#
: 변수를 사용해 전달된 인수의 개수 확인
- $@
: 모든 변수에 접근
-
함수
- python처럼 함수 정의 및 사용 가능
- 사용: 함수명+인자
- 변수 할당: 변수=$(함수명+인자)
function add_numbers {
local result=$(($1+$2))
echo $result
}
sum=$(add_numbers 10 20)
echo "두 수의 합: $sum"
- 조건문
- python처럼 if, while, case
문이 존재
- python처럼 \==, !=, &&, ||
연산자 사용 가능
- 파일 관련 조건문
- -e
exist; 파일 존재 여부 확인
- -f
file; 파일 여부 확인
- -d
directory; 디렉토리 여부 확인
- -r
readable; 읽기 여부 확인
Shell Script 활용하기
- Python이 설치되어 있지 않은 경우 유용함.
- script성으로 실행할 수 있는 것들
- e.g. 모델 학습 시, 여러 파라미터를 정의해 순차적으로 학습하는 script
- e.g. 로그 파일 분석, 데이터 전처리
- 서버를 잘 다루기 위해선 쉘 커맨드, 쉘 스크립트에 대해 알아야 함.
- 여러 명령어가 존재함을 알아두고, 필요할 때 검색해서 쓰자.
grep
, awk
, cut
등을 사용해 Python 없이 데이터 처리가 가능
- 쉘 스크립트로 모델 학습, 백그라운드 실행, 로그 파일 구성하는 task는 현업에서 많이 진행