6일차 - 리눅스 기초실습 04
* 프로세스(Process) : 현재 실행중인 프로그램
- 프로세스의 부모-자식 관계를 가짐
- 스케줄러가 실행한 프로세스인 init와 kthreadd 프로세스를 제외하면 모든 프로세스는 부모 프로세스를 가짐
* 프로세스 구성요소
- process ID (PID)
- priority
- nice value
- memory
- environmenrt
- file handles
- exit status
* 프로세스의 상태
- running
- stopped
- sleeping
- un-interruptable
- zombie
* ps : 프로세스 보기
* pgrep : 특정 프로세스 정보 검색
기본 형식 ) pgrep <옵션><패턴>
옵션 ) -x : 패턴과 정확히 일치하느 ㄴ프로세스 정보를 출력
-n :
-u user
* top : 실시간 프로세스의 상태 보기
- 현재 시스템의 상태에 대한 요약 정보 및 통계 제공. 실시간 방식으로 처리(3초마다). cpu사용량, 메모리, uid 등과 같은 다양한 기준에 따라 프로세스 정렬. 프로세스로 신호를 보낼 수 있음.
* 프로세스의 종류
- background process : command &
- foreground process : command
* 시그널(Signal) : 동작 중인 프로세스에게 전달하는 특정 메시지
- foreground process 에게 시그널 전달
- Ctrl + c
- Ctrl + z
- Ctrl + d
- background process 에게 시그널 전달
- kill 명령
* swp : vi 편집기에서 작업 중 비정상적인 종료시 swp 확장자 파일이 생겨남. 사용자가 예기치 못한 파일의 손상이나 유실을 막기 위해 생기는 백업 성질의 파일로, 유사시에 유용함.
* kill : 동작 중인 프로세스에게 시그널 전달
* 시스템 제어 명령어
* systemctl : 리눅스 서비스의 시작, 종료, 상태 확인 등을 수행.
기본 형식 ) systemctl <명령><서비스명>
ex)
root@ubuntu:~# sudo systemctl status apache2
root@ubuntu:/var/www/html# cat index.html
<h5>hi ho</h5>
* Shell : 사용자 명령어 해석기
- 사용자가 명령어 해석기
- 사용자가 프롬프트에 입력한 명령을 해석해서 운영체제에게 전달
* 사용 가능한 shell 리스트 확인
root@ubuntu:~# cat /etc/shells
* 현재 작업 shell 확인
root@ubuntu:~# echo $SHELL
/bin/bash
* 다른 종류의 shell 쓰는 방법
ex)
// 1) apt 명령으로 사용하고 싶은 shell 설치
$ sudo apt install <SHELL-PACHAGE>
// 2) default shell 을 변경
$ sudo chsh <USERNAME>
// 3) 확인
$ sudo grep <USERNAME> /etc/passwd
* Shell의 변수란
- 데이터를 넣는 그릇
- 선언할 필요 없이 사용 가능
- 변수명 : 문자, 숫자, _(언더바)로 구성될 수 있지만, 시작은 반드시 문자나 _로 시작
ex)
// 변수선언 : varname =value
$ fname=username
$ score=90
// 변수확인 : echo, set
$ echo $fname
$ set
// 변수제거 : unset varname
$ unset fname
// 예시
root@ubuntu:~# fname=ho
root@ubuntu:~# echo $fname
ho
root@ubuntu:~# set
BASH=/bin/bash
...
root@ubuntu:~# set | grep fname
fname=ho
root@ubuntu:~# unset fname
root@ubuntu:~# set | grep fname
_=fname
* Shell 환경 변수란?
- 동작되는 프로그램에게 영향을 주는 변수
* 환경 변수 선언 : export varName=value
$ export NAME=lee
$ echo $NAME
root@ubuntu:~# export $PATH=$PATH:/실행경로추가
// 1. 환경 변수 설정하기 (변수명=값)
vboxbibi@ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
vboxbibi@ubuntu:~$ PATH=$PATH:/home/vboxbibi/bin
vboxbibi@ubuntu:~$ echo $PATH // 환경변수 조회
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/vboxbibi/bin
// 2. 위의 방법은 리부팅 시 환경 변수 값이 사라짐
// 환경 변수를 영구적으로 설정하려면!
// ~/.bashrc 파일을 열고 파일 마지막에 환경 변수를 추가
vboxbibi@ubuntu:~$ vi ~/.bashrc
// 파일 저장 후 닫기
export PATH=$PATH:/home/vboxbibi/bin
// 터미널 재실행 하거나 source 명령어를 사용하여 실행 후 유지되는지 확인해보기
cf ) bashrc 파일에서 alias(별칭)을 설정할 수 있음
- ex) alias ll='ls -l' -> 이후 터미널에서 ll을 입력하면 ls -l 명령어가 실행됨.
* 시스템에 적용된 환경 변수 확인 : echo
$ env
* 기억해야 할 환경변수
- PATH : 명령어 탐색 경로
- HOME : 홈 디렉토리의 경로. cd 명
- USER : 로그인 사용자 이름
- SHELL : 로그인 shell의 이름
* Shell의 Quoting Rull
- Metacharacters :
Shell에서 특별히 의미를 정해 놓은 문자들
* Command 치환
- 명령어의 실행 결과를 치환하여 명령을 실행
* Nesting Commands
$(command)
'command'
// 출력 확인
vboxbibi@ubuntu:~$ echo "Today is $(date)"
Today is 2024. 02. 29. (목) 11:49:32 KST
vboxbibi@ubuntu:~$ echo "Today is 'date'"
Today is 'date'
* Shell의 alias
- Shell의 명령에 새로운 이름을 부여
- 명령들을 조합하여 새로운 이름의 명령을 생성
* alias 관리 명령
- 등록 : alias name='command'
- 확인 : alias or alias name
- 삭제 : unalias name
// alias 확인
vboxbibi@ubuntu:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
// alias 등록
vboxbibi@ubuntu:~$ alias rm='rm -i'
vboxbibi@ubuntu:~$ rm test02
rm: remove regular empty file 'test02'? n
// alias 삭제
vboxbibi@ubuntu:~$ unalias rm
* Shell의 prompt
cf) $ vi ~/.bashrc 명령어로
ps1 변수 부분에서, ANSI Color를 참고하면 색상 바꾸기 할 수 있음.
* Shell 의 Redirection
vboxbibi@ubuntu:~$ cat a 2 > error
vboxbibi@ubuntu:~$ cat error
cat: a: No such file or directory
vboxbibi@ubuntu:~$ ls
error
* Shell의 Pipeline
* Pipeline
- 명령의 실행결과를 다음 명령의 입력으로 전달
- 리눅스의 명령어를 조합하여 사용
- 기호 : command1 | command2 | command3
// 1.
vboxbibi@ubuntu:~$ ls -l | more
vboxbibi@ubuntu:~$ ls -l / | less
// 2.
vboxbibi@ubuntu:~$ history | more
// 3.
vboxbibi@ubuntu:~$ ls -al | cat -n | more
// 4.
vboxbibi@ubuntu:~$ du -h /bin/* | sort | more // abc 정렬
vboxbibi@ubuntu:~$ du -h /bin/* | sort -n | more // 크기정렬
// 5.
vboxbibi@ubuntu:~$ du -h /bin/* | sort -rh | head -n 7
// 6.
vboxbibi@ubuntu:~$ env | grep USER // 확인
USER=vboxbibi
vboxbibi@ubuntu:~$ cat /etc/passwd | grep $users
// 7-1. 현재 사용자로 실행된 모든 프로세스를 출력
vboxbibi@ubuntu:~$ ps -u $vboxbibi
// 7-2. 모든 프로세스를 출력하되, 특정 사용자에 대한 프로세스만 필터링
vboxbibi@ubuntu:~$ ps -e $vboxbibi
* Linux Shell Script란?
- 리눅스 command들을 모아 놓은 ASCII Text 파일
- 실행 퍼미션을 할당해야 실행 가능
// 실습1.
// 파일 작성
vboxbibi@ubuntu:~/bin$ vi sample.sh
#!/bin/bash
# Version : 1.0
# Description : Print hello world! for Linux
echo "Today: $(date +%Y-%m-%d)"
echo "Hello, Linux World"
// 실행
vboxbibi@ubuntu:~/bin$ sample.sh
Today: 2024-02-29
Hello, Linux World
// 실습2.
// 파일 작성
vboxbibi@ubuntu:~/bin$ vi var-usage.sh
#!/bin/bash
# Description : Print /var directory usage
echo "[/var Directory]"
echo "=================================================="
date +%Y-%m-%d
echo "=================================================="
du -sh /var 2> /dev/null
echo
// 실행
vboxbibi@ubuntu:~/bin$ chmod +x var-usage.sh
vboxbibi@ubuntu:~/bin$ var-usage.sh
[/var Directory]
==================================================
2024-02-29
==================================================
2.7G /var
* 위치 매개변수
// 실습1.
// 파일 작성
vboxbibi@ubuntu:~/bin$ cat parameter-exam1.sh
#!/bin/bash
#Usage : parameters-exam1.sh arg1 arg2 arg3
echo "THe script name: $0"
echo "THe first argument: $1"
echo "THe second argument: $2"
echo "THe number of arguments: $#"
echo "THe list of arguments: $@"
echo "THe list of arguments: $*"
// 파일 실행 결과 보기
vboxbibi@ubuntu:~/bin$ chmod +x parameter-exam1.sh
vboxbibi@ubuntu:~/bin$ parameter-exam1.sh red green blue
THe script name: /home/vboxbibi/bin/parameter-exam1.sh
THe first argument: red
THe second argument: green
THe number of arguments: 3
THe list of arguments: red green blue
THe list of arguments: red green blue
실습2.
// 파일 작성
vboxbibi@ubuntu:~/bin$ cat directory-usage.sh
echo "[$1 Directory]"
echo "======================================================="
date +%Y-%m-%d
echo "======================================================="
du -sh $q 2> /dev/null
echo
// 실행
vboxbibi@ubuntu:~/bin$ chmod +x directory-usage.sh
vboxbibi@ubuntu:~/bin$ directory-usage.sh /var
[/var Directory]
=======================================================
2024-02-29
=======================================================
20K .
* Prints text to standard output
형식 ) echo <옵션><메시지>
* read : 변수명 생략 시 기본 REPLY 변수에 채워짐
* print : 서식 format에 맞춰서 출력할 수 있음.
형식 ) printf format <메시지>
옵션 ) %d or %i : 숫자
%s : 문자열
%f : 실수형 숫자
vboxbibi@ubuntu:~/bin$ printf "hello linux shell\n"
hello linux shell
vboxbibi@ubuntu:~/bin$ today=$(date +%Y-%m-%d)
vboxbibi@ubuntu:~/bin$ printf "date is %s\n" "$today"
date is 2024-02-29
* 실습
// 실행 파일 만들기
vboxbibi@ubuntu:~/bin$ cat temp.sh
echo -n "Enter the Celsius: "
read celsius
fahrenheit=$(echo "scale=2; $celsius * 9 / 5 + 32" | bc)
echo "Fahrenheit is $fahrenheit"
// 실행
vboxbibi@ubuntu:~/bin$ chmod +x temp.sh
vboxbibi@ubuntu:~/bin$ temp.sh
Enter the Celsius: 20
Fahrenheit is 68.00
* exit : 실행된 프로그램이 종료된 상태를 전달
// ex)
vboxbibi@ubuntu:~/bin$ cp file1
cp: missing destination file operand after 'file1'
Try 'cp --help' for more information.
vboxbibi@ubuntu:~/bin$ echo $?
1
vboxbibi@ubuntu:~/bin$ sleep 100
^C
vboxbibi@ubuntu:~/bin$ echo $?
130
* test 연산자
- 비교연산자 test <명령어> or [명령어]
* 명령어 실행결과를 true 또는 false로 리턴함
* test 명령어는 다양한 연산자를 지원함
********* -f file -> 파일이 일반 파일이면 true를 리턴 으로 수정해야함!
-x file -> 실행 파일이고, 실행 권한이 있으면 true를 리턴 으로 수정해야함!
* if-then-fi
* 조건 명령어. command 실행 결과에 따라 서로 다른 command를 실행
// 실습1.
vboxbibi@ubuntu:~/bin$ cat number.sh
// 작성
echo -n "Input the number : "
read number
if [ "$number" -gt 5 ]; then
echo "It is greater than 5."
else
echo "It is less than or equal to 5."
fi
// 실행
vboxbibi@ubuntu:~/bin$ number.sh
Input the number : 4
It is less than or equal to 5.
* case .. in
- $var의 값에 따라 선택해서 명령어를 실행
// 실습
// 작성
vboxbibi@ubuntu:~/bin$ cat case-exam.sh
cat << END
================================
Please select a number
--------------------------------
1: Check disk usage
2: Check the login user list
----------------
END
echo -n "number: "
read number
case $number in
1) df -h;;
2) who;;
*) echo "Bad choice!"
exit 1;;
esac
exit 0
// 실행
vboxbibi@ubuntu:~/bin$ chmod +x case-exam.sh
vboxbibi@ubuntu:~/bin$ case-exam.sh
================================
Please select a number
--------------------------------
1: Check disk usage
2: Check the login user list
----------------
number: 1
Filesystem Size Used Avail Use% Mounted on
tmpfs 775M 1.4M 773M 1% /run
/dev/sda3 34G 13G 20G 40% /
...
vboxbibi@ubuntu:~/bin$ case-exam.sh
================================
Please select a number
--------------------------------
1: Check disk usage
2: Check the login user list
----------------
number: 2
vboxbibi tty2 2024-02-29 14:07 (tty2)
vboxbibi@ubuntu:~/bin$ case-exam.sh
================================
Please select a number
--------------------------------
1: Check disk usage
2: Check the login user list
----------------
number: 425
Bad choice!
cf) cat >> END : 터미널에서 여러 줄의 텍스트를 입력할 때 사용함.
이 명령어를 사용하면 텍스트를 입력하고 'END' 라는 특정 문자열을 입력하는 것으로 입력을 끝낼 수 있음.
vboxbibi@ubuntu:~/bin$ cat /etc/lsb-release
vboxbibi@ubuntu:~/bin$ date +"%F %T"
2024-02-29 16:45:15
* expr : 정수형 산술연산(+, -, *, /, %), 논리연산(|, &), 관계연산(=, !=, >, >=, <, <=)
* let : 정수형 산술연산, bit 연산(<<, >>, &, |), 논리연산(&&, ||), 단항연산(++, +=, -=)
* bc : 실수연산. 강력한 계산기 도구로서 다양한 수식을 계산하고 변수를 사용하여 작업할 수 있음.
cf) scale=2 -> 소수 2번째 자리까지 계산
vboxbibi@ubuntu:~/bin$ echo "scale=2; 10/3" | bc
3.33
* 조건부 loop
* while : while 다음의 command가 성공하는 동안 do~done 사이의 명령어를 반복 실행
* until : untile 다음의 command가 성공할 때 까지 do~done 사이의 명령어를 반복 실행
* for-loop : 주어진 list 만큼 do ~ done 사이의 명령어를 반복 실행
for item in [LIST]
do
[COMMAND]
done