프로세스 관리
CPU
프로그램의 명령어를 해석해 산술 연산, 논리 연산 등 모든 연산을 수행하는 컴퓨터의 두뇌
여러 CPU가 하나의 칩에 장착
프로세서: 여러 CPU로 된 하나의 칩
코어: 프로세성 장착된 CPU
멀티 코어 프로세서: 코어가 여러 개
레지스터
CPU 내부에 포함된 아주 작고 빠른 메모리
CPU가 연산을 수행할 떄 필요한 데이터를 임시로 저장
메모리
RAM, 프로그램 코드와 데이터를 저장하는 공간
CPU와 물리적으로 떨어져 시스템 버스 통로로 연결
휘발성 메모리: 저장된 데이터는 컴퓨터가 꺼지면 모두 사라짐
저장장치
HDD, SSD, 플레시 매모리 / 디스크
비휘발성 메모리: 저장 장치에 저장된 데이터는 컴퓨터의 전원이 꺼져도 보존
시스템 버스
컴퓨터 내부에서 데이터를 주고받는 통로
CPU, 메모리, 디스크 등 구성 요소가 데이터 주고 받을 때 버스 사용
주소 버스, 데이터 버스, 제어 버스 등 여러 종류
(프로그램을 작동시키면 디스크에 저장된 프로그램 실행코드를 시스템 버스를 통해 메모리로 적재
디스크에 저장된 프로그램 코드를 메모리에 복사)
프로세스
메모리에서 실행 중인 프로그램
프로그램
디스크에 저장된 실행 파일
프로세스 계층 구조
부모 프로세스: 프로세스를 생성한 프로세스
자식 프로세스: 부모 프로세스가 생성한 프로세스
init프로세스
모든 프로세스의 시조
리눅스 커널이 부팅하며 만든 최초의 프로세스
전통적으로 PID(프로세스 ID)에 1 부여
보통 초기화 프로세스로 sysyemd를 설정
프로세스 종료
자식 프로세스가 종료될 때까지 무한 대기
부모 프로세스가 다른 작업을 하다가 주기적으로 자식 프로세스가 종료 됐는지 확인
SIGCHLD 시그널을 수신했을 때 자식 프로세스를 종료 처리하는 방법
좀비 프로세스
프로세스가 종료됐지만 종료 처리를 하지 않아 프로세스가 완전히 정리되지 않은 상태
고아 프로세스
부모 프로세스가 자식 프로세스보다 먼저 종료된 경우 자식 프로세스가 가리킴
ps
현재 실행 중인 프로세스에 대한 정보를 보여줌
steezer@DESKTOP-TF8J569:~$ cd 260310
steezer@DESKTOP-TF8J569:~/260310$ ps
PID TTY TIME CMD
465 pts/2 00:00:00 bash
6869 pts/2 00:00:00 ps
steezer@DESKTOP-TF8J569:~/260310$ ps -f
UID PID PPID C STIME TTY TIME CMD
steezer 465 464 0 09:02 pts/2 00:00:00 -bash
steezer 6871 465 0 09:51 pts/2 00:00:00 ps -f
steezer@DESKTOP-TF8J569:~/260310$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:01 ? 00:00:01 /lib/systemd/systemd --system --deserialize 41
root 2 1 0 09:01 ? 00:00:00 /init
root 8 2 0 09:01 ? 00:00:00 plan9 --control-socket 7 --log-level 4 --server-fd 8 -
root 95 1 0 09:01 ? 00:00:00 snapfuse /var/lib/snapd/snaps/core22_2339.snap /snap/c
root 96 1 0 09:01 ? 00:00:00 snapfuse /var/lib/snapd/snaps/asciiquarium_59.snap /sn
root 97 1 0 09:01 ? 00:00:01 snapfuse /var/lib/snapd/snaps/snapd_25935.snap /snap/s
root 199 1 0 09:01 ? 00:00:00 /usr/sbin/cron -f -P
message+ 201 1 0 09:01 ? 00:00:00 @dbus-daemon --system --address=systemd: --nofork --no
root 206 1 0 09:01 ? 00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-st
root 209 1 0 09:01 ? 00:00:00 /usr/lib/snapd/snapd
root 210 1 0 09:01 ? 00:00:00 /lib/systemd/systemd-logind
root 215 1 0 09:01 hvc0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console
root 223 1 0 09:01 tty1 00:00:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
root 241 1 0 09:01 ? 00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unatte
root 350 2 0 09:02 pts/1 00:00:00 /bin/login -f
steezer 393 1 0 09:02 ? 00:00:00 /lib/systemd/systemd --user
steezer 394 393 0 09:02 ? 00:00:00 (sd-pam)
steezer 407 350 0 09:02 pts/1 00:00:00 -bash
root 463 2 0 09:02 ? 00:00:00 /init
root 464 463 0 09:02 ? 00:00:00 /init
steezer 465 464 0 09:02 pts/2 00:00:00 -bash
root 630 1 0 09:48 ? 00:00:00 /usr/libexec/packagekitd
root 634 1 0 09:48 ? 00:00:00 /usr/libexec/polkitd --no-debug
systemd+ 2052 1 0 09:49 ? 00:00:00 /lib/systemd/systemd-resolved
root 2054 1 0 09:49 ? 00:00:00 /lib/systemd/systemd-journald
systemd+ 2111 1 0 09:49 ? 00:00:00 /lib/systemd/systemd-timesyncd
syslog 3936 1 0 09:50 ? 00:00:00 /usr/sbin/rsyslogd -n -iNONE
root 4173 1 0 09:50 ? 00:00:00 /lib/systemd/systemd-udevd
steezer 6872 465 0 09:52 pts/2 00:00:00 ps -ef
steezer@DESKTOP-TF8J569:~/260310$ ps -ef --forest
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:01 ? 00:00:01 /lib/systemd/systemd --system --deserialize 41
root 2 1 0 09:01 ? 00:00:00 /init
root 8 2 0 09:01 ? 00:00:00 \_ plan9 --control-socket 7 --log-level 4 --server-fd
root 350 2 0 09:02 pts/1 00:00:00 \_ /bin/login -f
steezer 407 350 0 09:02 pts/1 00:00:00 | \_ -bash
root 463 2 0 09:02 ? 00:00:00 \_ /init
root 464 463 0 09:02 ? 00:00:00 \_ /init
steezer 465 464 0 09:02 pts/2 00:00:00 \_ -bash
steezer 6873 465 0 09:53 pts/2 00:00:00 \_ ps -ef --forest
root 95 1 0 09:01 ? 00:00:00 snapfuse /var/lib/snapd/snaps/core22_2339.snap /snap/c
root 96 1 0 09:01 ? 00:00:00 snapfuse /var/lib/snapd/snaps/asciiquarium_59.snap /sn
root 97 1 0 09:01 ? 00:00:01 snapfuse /var/lib/snapd/snaps/snapd_25935.snap /snap/s
root 199 1 0 09:01 ? 00:00:00 /usr/sbin/cron -f -P
message+ 201 1 0 09:01 ? 00:00:00 @dbus-daemon --system --address=systemd: --nofork --no
root 206 1 0 09:01 ? 00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-st
root 209 1 0 09:01 ? 00:00:00 /usr/lib/snapd/snapd
root 210 1 0 09:01 ? 00:00:00 /lib/systemd/systemd-logind
root 215 1 0 09:01 hvc0 00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console
root 223 1 0 09:01 tty1 00:00:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
root 241 1 0 09:01 ? 00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unatte
steezer 393 1 0 09:02 ? 00:00:00 /lib/systemd/systemd --user
steezer 394 393 0 09:02 ? 00:00:00 \_ (sd-pam)
root 630 1 0 09:48 ? 00:00:00 /usr/libexec/packagekitd
root 634 1 0 09:48 ? 00:00:00 /usr/libexec/polkitd --no-debug
systemd+ 2052 1 0 09:49 ? 00:00:00 /lib/systemd/systemd-resolved
root 2054 1 0 09:49 ? 00:00:00 /lib/systemd/systemd-journald
systemd+ 2111 1 0 09:49 ? 00:00:00 /lib/systemd/systemd-timesyncd
syslog 3936 1 0 09:50 ? 00:00:00 /usr/sbin/rsyslogd -n -iNONE
root 4173 1 0 09:50 ? 00:00:00 /lib/systemd/systemd-udevd
프로세스 생성과 종료
kill [옵션] PID
killall [옵션] 프로세스_이름
sleep 시간
steezer 6875 465 0 09:55 pts/2 00:00:00 sleep 300
steezer@DESKTOP-TF8J569:~$ ps -ef | grep sleep
steezer 6875 465 0 09:55 pts/2 00:00:00 sleep 300
steezer 6898 6878 0 09:55 pts/0 00:00:00 grep --color=auto sleep
steezer@DESKTOP-TF8J569:~$ kill 6875
steezer@DESKTOP-TF8J569:~$ ps -ef | grep sleep
steezer 6903 465 0 09:58 pts/2 00:00:00 sleep 300
steezer 6905 6878 0 09:58 pts/0 00:00:00 grep --color=auto sleep
steezer@DESKTOP-TF8J569:~$ kill -KILL 6903
steezer@DESKTOP-TF8J569:~/260310$ sleep 300
Killed
steezer@DESKTOP-TF8J569:~$ killall -TERM sleep
steezer@DESKTOP-TF8J569:~/260310$ sleep 300
Terminated
프로세스의 작동
생애주기
현실과 비교
현실 : 시스템
지구 : 운영체제
생물 종류: 프로그램 종류
생명 탄생: 프로세스 생성
생명 죽음 : 프로세스의 소멸
멀티 태스킹을 위한 여러 기법
프로세스 스케줄링: 여러프로세스 중 CPU가 처리할 프로세스를 결정하는 행위
ㄴ이를 담당하는 주체가 프로세스 스케줄러
스케줄링 알고리즘: 프로세스 스케줄러가 처리할 프로세스를 선택하는 방법
ㄴ공평성, 우선순위, 효율성, 응답 시간
컨텍스트 스위칭: 프로세스 스케줄링에 따라 처리되는 프로세스가 변경되는 일련의 과정
ㄴ현재 프로세스 상태 저장(프로세스 제어블록에)->다음 프로세스 선택과 실행
ㄴ컨텍스트 스위칭 오버헤드(메모리 공간을 추가 사용, 시간도 소모)
ㄴ발생시키는 이벤트:인터럽트, 시스템 콜, 시그널, 예외
프로세스 상태
실행/실행 대기 상태
중단 상태
종료 상태
수면 상태
(깨어날 수 있는 수면 상태, 깨어나지 않는 수면 상태)
프로세스 종료 상태
0~255 사이 종료 코드와 프로세스가 종료될 때 받은 시그널 정보로 구성
종료 코드: 0 성공, 이외 실패
시그널 정보: 비정상 종료의 경우를 위한 정보
스레드: 프로세스의 가장 작은 실행 단위
싱글 스레드 프로세스, 멀티 스레드 프로세스 존재
파일 디스크립터:프로세스별 파일 관리
표준 스트림 또는 표준 입출력: 프로세스가 생성되면 기본적으로 열게 되는 파일들
ㄴ(스트림: 표준 입력, 표준 출력, 표준 에러)
포어그라운드 프로세스: 사용자와 상호작용이 필요
백그라운드 프로세스: 사용자와 상호작용이 필요 X
ping 명령어: 네트워크 연결상태 확인
ㄴICMP의 에코 요청 패킷을 대상 호스트로 보냄
ICMP: 네트워크 장치에서 네트워크 통신 문제를 진단하는 데 사용하는 프로토콜
jobs [옵션] [작업] / 시스템 관리자나 사용자가 현재 셀 세션에서 실행되는 작업을 관리하는 데 사용
ㄴ여러 작업 동시에 실행, 백그라운드 작업 관리에 효과적
steezer@DESKTOP-TF8J569:~/260310$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=28.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=28.9 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=28.7 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=116 time=29.0 ms
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 28.159/28.676/28.972/0.316 ms
steezer@DESKTOP-TF8J569:~/260310$ ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=28.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=29.2 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=28.4 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 28.368/28.683/29.193/0.363 ms
steezer@DESKTOP-TF8J569:~/260310$ ping -c 3 8.8.8.8 &
[1] 6949
steezer@DESKTOP-TF8J569:~/260310$ PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=28.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=29.0 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=29.0 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 28.840/28.951/29.017/0.079 ms
^C
[1]+ Done ping -c 3 8.8.8.8
steezer@DESKTOP-TF8J569:~/260310$ ping -q -c 10 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^Z
[1]+ Stopped ping -q -c 10 8.8.8.8
steezer@DESKTOP-TF8J569:~/260310$ bg
[1]+ ping -q -c 10 8.8.8.8 &
steezer@DESKTOP-TF8J569:~/260310$
--- 8.8.8.8 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 17160ms
rtt min/avg/max/mdev = 27.888/28.871/29.402/0.508 ms
[1]+ Done ping -q -c 10 8.8.8.8
steezer@DESKTOP-TF8J569:~/260310$ ping -q -c 10 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^Z
[1]+ Stopped ping -q -c 10 8.8.8.8
steezer@DESKTOP-TF8J569:~/260310$ fg
ping -q -c 10 8.8.8.8
^C
--- 8.8.8.8 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 12332ms
rtt min/avg/max/mdev = 28.516/28.819/29.170/0.237 ms
steezer@DESKTOP-TF8J569:~/260310$ ping -q -c 600 8.8.8.8 &
[1] 6957
steezer@DESKTOP-TF8J569:~/260310$ PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
steezer@DESKTOP-TF8J569:~/260310$ ping -q -c 600 www.google.com &
[2] 6958
steezer@DESKTOP-TF8J569:~/260310$ PING www.google.com (172.217.213.147) 56(84) bytes of data.
steezer@DESKTOP-TF8J569:~/260310$ ping -q -c 600 www.wikipedia.org &
[3] 6959
steezer@DESKTOP-TF8J569:~/260310$ PING dyna.wikimedia.org (103.102.166.224) 56(84) bytes of data.
steezer@DESKTOP-TF8J569:~/260310$ jobs
[1] Running ping -q -c 600 8.8.8.8 &
[2]- Running ping -q -c 600 www.google.com &
[3]+ Running ping -q -c 600 www.wikipedia.org &
steezer@DESKTOP-TF8J569:~/260310$ jobs -l
[1] 6957 Running ping -q -c 600 8.8.8.8 &
[2]- 6958 Running ping -q -c 600 www.google.com &
[3]+ 6959 Running ping -q -c 600 www.wikipedia.org &
steezer@DESKTOP-TF8J569:~/260310$
IPC
프로세스 간 통신
파이프
두 프로세스 간 데이터 전송할 때 사용하는 IPC
ㄴ명명된 파이프: 파이프에 파일 형식의 이름 부여
메시지 큐
정해진 큐에 메시지를 넣고 빼는 방식(선입 선출)
소켓
네트워크로 연결된 다른 시스템에서 작동하는 프로세스와 통신할 때 사용
ㄴ인터넷 소켓, 유닉스 도메인 소켓
공유 메모리
데이터를 보내고 받는 것이 아닌 데이터 자체를 공유하는 개념
ㄴ사용할 때 반드시 동기화 고려
세마포어
임계 영역을 보호하기 위한 수단
공유 메모리에서 프로세스의 동시 접근을 제한하거나 프로세스의 순서를 조절할 때 사용
ㄴ카운팅 세마포어(어떤 자원을 n개 프로세스만 사용할 수 있게 할 때)
ㄴ바이너리 세마포어, 뮤텍스: 자원을 독점적으로 사용할 수 있도록 세마포어 초기 설정 값을 1로 설정하는 세마포어
시그널
POSIX에서 정의한 IIPC 도구
프로세스에 어떤 이벤트가 발생했음을 알려주기 위해 사용
시그널 송수신
ㄴ시그널은 커널이 프로세스에 보내기도 하고, 프로세스가 다른 프로세스에 보내기도 함, 프로세스가 자기 자신에게 시그널을 보낼 수도 있음
ㄴ 소켓과 같이 데이터 교환을 주 목적으로 하는 IPC와 달리 시그널은 중복 시그널 처리할 수 없음, 프로세스가 한 시그널을 수신하고 해당 시그널을 처리하기 전에 같은 종류의 시그널을 수신한다면 두 번째 도착한 시그널은 무시 됨
시그널 종류
| SIGABRT | 의도적인 중단 |
| SIGALRM | 정해진 시간이 됨 |
| SIGBUS | 하드웨어 버스 에러 |
| SIGCHLD | 자식 프로세스 종료 |
| SIGSTOP | 프로세스 중단 |
| SIGCONT | 중단된 프로세스 재개 |
| SIGHUP | 프로세스의 제어 터미널이 닫힘 |
| SIGINT | 사용자가 인터럽트 생성(Ctrl+C) |
| SIGQUIT | 사용자가 종료 문자 생성(Ctrl+\) |
| SIGTSTP | 사용자가 일시 중지 문자 생성(Ctrl+Z) |
| SIGPIPE | 프로세스가 잘못된 파이프에 쓰기 시도 |
| SIGSEGV | 허용되지 않은 메모리 영역에 접근할 때 발생 |
| SIGKILL | 프로세스 종료 명령 |
| SIGTERM | 프로세스 종료 명령(조건에 따른 처리 가능) |
| SIGUSR1 | 사용자 정의 시그널 1 |
| SIGUSR2 | 사용자 정의 시그널 2 |
시그널 처리 방법
프로세스가 시그널을 수신하면 프로세스는 수신한 시그널을 처리해야 함
프로그램은 시그널별로 어떻게 처리할지 프로그램 코드 수준에서 정의할 수 있음
특정 시그널을 수신했을 때 무시하거나 원하는 일을 정의한 시그널 핸들러를 지정할 수도 있음
시그널 핸들러가 지정되지 않은 시그널은 시그널의 기본 처리 방법대로 동작함
프로세스를 종료시키거나 중지/재개시킬 수 있고, 코어 덤프 파일을 남기며 프로세스 종료할 수도 있음
steezer@DESKTOP-TF8J569:~$ ps -ef | grep ping
steezer 7944 7916 0 12:26 pts/0 00:00:00 ping 8.8.8.8
steezer 7965 7951 0 12:26 pts/2 00:00:00 grep --color=auto ping
steezer@DESKTOP-TF8J569:~$ kill -TERM 7944
steezer@DESKTOP-TF8J569:~$ ps -ef | grep ping
steezer 7966 7916 0 12:27 pts/0 00:00:00 ping 8.8.8.8
steezer 7968 7951 0 12:27 pts/2 00:00:00 grep --color=auto ping
steezer@DESKTOP-TF8J569:~$ kill -SIGINT 7966
steezer@DESKTOP-TF8J569:~$ ps -ef | grep ping
steezer 7969 7916 0 12:27 pts/0 00:00:00 ping 8.8.8.8
steezer 7971 7951 0 12:27 pts/2 00:00:00 grep --color=auto ping
steezer@DESKTOP-TF8J569:~$ kill -SIGSTOP 7969
steezer@DESKTOP-TF8J569:~$ kill -SIGCONT 7969
steezer@DESKTOP-TF8J569:~$ kill -SIGSTOP 7969
steezer@DESKTOP-TF8J569:~$ ps -ef | grep ping
steezer 7969 7916 0 12:27 pts/0 00:00:00 ping 8.8.8.8
steezer 8012 7916 0 12:31 pts/0 00:00:00 ping 8.8.8.8
steezer 8013 7999 0 12:31 pts/3 00:00:00 ping 8.8.4.4
steezer 8015 7951 0 12:31 pts/2 00:00:00 grep --color=auto ping
steezer@DESKTOP-TF8J569:~$ killall -TERM -v ping
Killed ping(7969) with signal 15
Killed ping(8012) with signal 15
Killed ping(8013) with signal 15
steezer@DESKTOP-TF8J569:~$
PID가 12345인 프로세스에 SIGINT 시그널을 보내려할 때 해당하는 명령어
kill -SIGINT 12345
ping 프로세스 여러 개가 동작 중인 상황에서 명령 하나로 ping 프로세스 모두 종료시키려할 때 해당하는 명령어
killall ping
변수
변수_이름 = 값
steezer@DESKTOP-TF8J569:~/260310$ cd ..
steezer@DESKTOP-TF8J569:~$ mkdir script
steezer@DESKTOP-TF8J569:~$ cd script
steezer@DESKTOP-TF8J569:~/script$ VAR="value"
steezer@DESKTOP-TF8J569:~/script$ echo ${VAR}
value
steezer@DESKTOP-TF8J569:~/script$ world="Banana"
steezer@DESKTOP-TF8J569:~/script$ echo $worldIsMine
steezer@DESKTOP-TF8J569:~/script$ echo ${world}IsMine
BananaIsMine
steezer@DESKTOP-TF8J569:~$ a=1
steezer@DESKTOP-TF8J569:~$ echo $a
1
steezer@DESKTOP-TF8J569:~$ b=$a+1
steezer@DESKTOP-TF8J569:~$ echo $b
1+1
steezer@DESKTOP-TF8J569:~$ b=${a}+1
steezer@DESKTOP-TF8J569:~$ echo $b
1+1
let "표현식"
steezer@DESKTOP-TF8J569:~$ a=1
steezer@DESKTOP-TF8J569:~$ let "b = a + 1"
steezer@DESKTOP-TF8J569:~$ echo $b
2
steezer@DESKTOP-TF8J569:~$ let "b = b * 2"
steezer@DESKTOP-TF8J569:~$ echo $b
4
expr 표현식
steezer@DESKTOP-TF8J569:~/script$ a=8
steezer@DESKTOP-TF8J569:~/script$ b=2
steezer@DESKTOP-TF8J569:~/script$ expr $a + $b
10
steezer@DESKTOP-TF8J569:~/script$ expr $a - $b
6
steezer@DESKTOP-TF8J569:~/script$ expr $a / $b
4
steezer@DESKTOP-TF8J569:~/script$ expr $a \* $b
16
steezer@DESKTOP-TF8J569:~/script$ expr $a + $b
10
steezer@DESKTOP-TF8J569:~/script$ result=$(expr $a + $b)
steezer@DESKTOP-TF8J569:~/script$ echo $result
10
조건문
if문
if 조건
then
명령
fi
※들여쓰기 == 인덴테이션, 인덴트, 중요 X 가독성을 위할 뿐
if 조건
then
명령1
else
명령2
fi
조건문 중첩 지원 O
if 조건1
then
명령1
else
if 조건2
then
명령2
else
명령3
fi
fi
조건 끝에 세미콜론 표시
if 조건;then
명령
fi
if 조건; then
명령1
else
명령2
fi
if 조건1; then
명령1
elif 조건2; then
명령2
else
명령3
fi
steezer@DESKTOP-TF8J569:~$ if ls
> then
> echo "Result is success"
> else
> echo "Result is fail"
> fi
260309 260310 greetings normal_file script snap
Result is success
steezer@DESKTOP-TF8J569:~$ ls asdf
ls: cannot access 'asdf': No such file or directory
steezer@DESKTOP-TF8J569:~$ echo $?
2
steezer@DESKTOP-TF8J569:~$ if ls asdf
> then
> echo "Result is success"
> else
> echo "Result is fail"
> fi
ls: cannot access 'asdf': No such file or directory
Result is fail
[명령어
if문에서 가장 많이 사용하는 명령어
steezer@DESKTOP-TF8J569:~$ ls -al /usr/bin | head
total 108076
drwxr-xr-x 2 root root 36864 Mar 10 12:01 .
drwxr-xr-x 14 root root 4096 Jan 7 2025 ..
-rwxr-xr-x 1 root root 18456 Feb 8 2021 411toppm
-rwxr-xr-x 1 root root 31104 Jan 28 2022 JxrDecApp
-rwxr-xr-x 1 root root 32536 Jan 28 2022 JxrEncApp
lrwxrwxrwx 1 root root 4 Feb 17 2020 NF -> col1
lrwxrwxrwx 1 root root 1 Mar 25 2022 X11 -> .
-rwxr-xr-x 1 root root 51648 Feb 8 2024 [
-rwxr-xr-x 1 root root 35344 Mar 7 2024 aa-enabled
if [ 표현식 ]; then
fi
if [[ 표현식 ]]; then
fi
문자열 테스트 연산자
=, ==, !=, >, <, -n, -z
#!/bin/bash
A="hello"
B="world"
if [ "$A" == "$B" ]; then
echo "== operator: True"
else
echo "== operator: False"
fi
if [ "$A" != "$B" ]; then
echo "!= operator: True"
else
echo "!= operator: False"
fi
if [ "$A" \> "$B" ]; then
echo "> operator: True"
else
echo "> operator: False"
fi
if [ -n "$A" ]; then
echo "-n operator: True"
else
echo "-n operator: False"
fi
if [ -z "$A" ]; then
echo "-z operator: True"
else
echo "-z operator: False"
fi
steezer@DESKTOP-TF8J569:~/script$ chmod +x string.sh
steezer@DESKTOP-TF8J569:~/script$ ./string.sh
== operator: False
!= operator: True
> operator: False
-n operator: True
-z operator: False
steezer@DESKTOP-TF8J569:~/script$ chmod +x filetest.sh
steezer@DESKTOP-TF8J569:~/script$ ./filetest.sh
target file is string.sh
-f operator: True
-r operator: True
-d operator: False
-s operator: True
target file is /etc/passwd
-r operator: True
-w operator: False
-x operator: False
변수
변수는 데이터를 담는 그릇으로, Bash는 변수에 문자열 형식으로 값을 저장
변수에 저장된 값을 사용할 때는 변수 이름을 ${}로 감싸서 사용
조건문
조건문은 주어진 조건이 참인지 거짓인지에 따라 다른 명령을 수행할 수 있음
if 문의 조건 부분이 참(True)인 경우에만 then 이후 명령 부분을 실행
조건으로 일반 명령을 사용할 수 있는데, 명령의 성공/실패에 따라 if 문의 참/거짓이 결정
if 문에 else가 포함돼 있으면 then 이후 명령 부분은 조건이 참인 경우에만 실행되고, else 이후 명령 부분은 조건이 거짓인 경우에만 실행
if 문의 else 부분에 if 문이 중첩되면 elif 키워드를 사용해 한 문장으로 만들 수 있음
if 조건1; then
명령1
elif 조건2; then
명령2
else
명령3
fi
[ 명령어
조건문에서 다양한 조건 판단을 할 때는 [ 명령어(싱글 브래킷)을 사용
[ 명령어에서는 다음과 같은 연산자를 사용 가능
| 구분 | 연산자 | 설명 |
| 문자열 테스트 연산자 | = 또는 == | 두 문자열이 같으면 참 |
| != | 두 문자열이 다르면 참 | |
| > 또는 < | 두 문자열을 사전식으로 비교 | |
| -n | 문자열의 길이가 0이 아니면 참 | |
| -z | 문자열의 길이가 0이면 참 문자열에 값이 설정돼 있지 않거나 빈 문자열(empty string)인 경우 문자열의 길이를 0으로 판단 |
| 산술 테스트 연산자 | -eq | equal의 약자로, 연산자 좌우의 값이 같으면 참을 반환 |
| -ne | not equal의 약자로, 연산자 좌우의 값이 다르면 참을 반환 | |
| -le | less than or equal의 약자로, 연산자 좌측 값이 우측 값보다 작거나 같으면 참을 반환 | |
| -lt | less than의 약자로, 연산자 좌측 값이 우측 값보다 작으면 참을 반환 | |
| -gt | greater than의 약자로, 연산자 좌측 값이 우측 값보다 크면 참을 반환 | |
| -ge | greater than or equal의 약자로, 연산자 좌측 값이 우측 값보다 크거나 같으면 참을 반환 |
| 파일 테스트 연산자 | -e | 파일이 존재하면 참을 반환 |
| -f | 파일이 일반 파일이면 참을 반환 | |
| -d | 파일이 디렉터리면 참을 반환 | |
| -s | 파일이 비어 있지 않으면(크기가 0이 아니면) 참을 반환 | |
| -L | 파일이 심볼릭 링크면 참을 반환 | |
| -r | 파일에 읽기 권한이 있으면 참을 반환 | |
| -w | 파일에 쓰기 권한이 있으면 참을 반환 | |
| -x | 파일에 실행 권한이 있으면 참을 반환 | |
| 논리 테스트 연산자 | -a | AND 연산 |
| -o | OR 연산 | |
| ! | NOT 연산 |
더블 브래킷은 문자가 다른 의미로 해석되는 것을 막기 때문에 *나 부등호에 백슬래시를 붙일 필요 없음
정규 표현식 사용 가능
산술 연산을 위해 이중 괄호 연산을 사용할 수 있음
반복문
for 문은 셸 스크립트에서 사용하는 반복문 중 하나
반복문에서 반복되는 구문을 루프(loop)라고 함
for 문으로 만들어진 루프는 주어진 목록이나 범위에서 명령을 반복해서 실행
for 문은 파일 목록이나 문자열 목록, 산술적 범위 등을 순회할 때 유용
각 반복(iteration)에서는 목록이나 범위의 항목을 변수에 할당하고 해당 변수로 명령을 실행함
for 변수 in 목록
do
명령
done
for 변수 in 목록; do 명령; done
목록 부분에는 반복하고 싶은 항목들의 목록을 지정
변수 부분에는 매 반복에서 목록 부분에 지정한 항목을 저장할 변수의 이름을 넣음
이렇게 하면 반복이 일어날 때마다 변수에 지정한 항목이 하나씩 값으로 저장
C 언어의 for 문과 유사한 형식으로 작성 가능
for ((초기식; 조건식; 증감식))
do
명령
done
C 언어 스타일의 for 문은 이중 괄호 표현식을 사용
이중 괄호 안에는 세미콜론으로 구분한 초기식, 조건식, 증감식이 있음
초기식은 for 문을 시작하면서 한 번만 실행되는 표현식
조건식은 for 문을 언제까지 반복할지 판단하는 표현식
for 문은 조건식을 만족하는 동안 반복
증감식은 for 문을 반복할 때마다 실행할 표현식
주로 반복이 일어날 때마다 어떤 값을 변경하고, 변경된 정보를 명령 부분에서 사용
초기식, 조건식, 증감식 모두 산술 표현식으로 작성
산술 표현식
산술 연산자가 포함된 연산식
while 문
조건이 참인 동안 명령을 반복해서 실행하는 반복문
주어진 조건이 거짓이 될 때까지 루프 안 명령을 계속 실행
for 문과 같은 초기식과 증감식이 없음
루프 안 명령에서 조건의 판단 결과가 변경돼야 함
while 조건식
do
명령
done
while 조건식; do 명령; done
until 문
조건이 거짓인 동안 명령을 반복해서 실행하는 반복문
while 문과 비슷하지만, 반복을 종료하는 기준이 반대
while 문은 조건식이 참인 동안 반복 실행하지만, until 문은 조건식이 거짓인 동안 반복
until 문은 조건식이 참이 되면 반복을 종료
until 조건식
do
명령
done
until 조건식; do 명령; done
break와 continue
for 문, while 문, until 문과 같은 반복문에서 제어 흐름을 변경하는 명령어
break는 반복문의 실행을 즉시 중단하고 반복문 밖으로 빠져나가는 데 사용
일반적으로 break는 조건문을 이용해 특정 조건을 만족할 때 반복을 강제로 종료
break는 무한히 반복되는 것을 방지하거나 필요한 데이터를 찾은 후 더 이상 반복 실행할 필요가 없을 때 유용함
break는 가장 내부 반복문을 종료하며, 선택적으로 숫자 인자(n)를 통해 중단할 외부 반복문의 레벨을 지정할 수 있음
break [n]
continue는 반복문에서 현재 반복을 중단하고 다음 반복으로 넘어갈 때 사용
continue를 만나면 루프에서 나머지 부분을 건너뛰고 다음 반복을 시작
continue는 반복문에서 조건을 만족하는 경우에만 특정 부분을 실행하거나 목록의 어떤 항목을 건너뛰고 싶을 때 유용함
continue는 가장 내부 반복문에 영향을 미치며, 선택적으로 숫자 인자(n)를 통해 영향을 미칠 외부 반복문의 레벨을 지정할 수 있음
continue [n]
'로보테크AI' 카테고리의 다른 글
| 융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/12 (0) | 2026.03.12 |
|---|---|
| 융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/11[ROS2] (0) | 2026.03.11 |
| 융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/09[Linux] (0) | 2026.03.09 |
| 융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/06[발표회1] (0) | 2026.03.06 |
| 융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/05 (0) | 2026.03.05 |