ํ์ํ ๋ฐฐ๊ฒฝ ์ง์
Linux ์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ ์ ์ดํดํ๊ธฐ ์ํด์๋ ๋ค์ ๊ฐ๋ ๋ค์ ์๊ณ ์์ด์ผ ํ๋ค:
- ๊ธฐ๋ณธ์ ์ธ Shell ๋ช ๋ น์ด ์ฌ์ฉ๋ฒ
- ํ์ผ ์์คํ ๊ถํ ๊ฐ๋
- ํ๋ก์ธ์ค์ Shell์ ๊ด๊ณ
- File descriptor์ ๊ธฐ๋ณธ ๊ฐ๋
- ํ์ค ์ ๋ ฅ(stdin), ํ์ค ์ถ๋ ฅ(stdout), ํ์ค ์๋ฌ(stderr)์ ๊ฐ๋
๊ฐ๋ ์ค๋ช
์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ ์ด๋?
ํ๋ก๊ทธ๋จ์ ์ถ๋ ฅ์ ์ํ๋ ๋ชฉ์ ์ง๋ก ๋ณ๊ฒฝํ๋ ๋ฉ์ปค๋์ฆ์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ถ๋ ฅ์ ํฐ๋ฏธ๋๋ก ์ ์ก๋์ง๋ง, ๋ฆฌ๋ค์ด๋ ์ ์ ํตํด ํ์ผ์ด๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ผ๋ก ์ ํํ ์ ์๋ค.
์ค์ํ ๋น์ : ์ฐํธ๋ฌผ ๋ถ๋ฅ ์์คํ
์ฐ์ฒด๊ตญ์ ์ฐํธ๋ฌผ ๋ถ๋ฅ ์์คํ ์ ํตํด ๋ฆฌ๋ค์ด๋ ์ ์ ์ดํดํด๋ณด์:
-
์ผ๋ฐ ์ฐํธ๋ฌผ (stdout, 1)
- ๊ธฐ๋ณธ ๋ฐฐ์ก ๊ฒฝ๋ก = ํฐ๋ฏธ๋ ์ถ๋ ฅ
- ๋ฐฐ์ก์ง ๋ณ๊ฒฝ = ํ์ผ๋ก ๋ฆฌ๋ค์ด๋ ์
-
๊ธด๊ธ ์ฐํธ๋ฌผ (stderr, 2)
- ํน๋ณ ์ฒ๋ฆฌ ๊ฒฝ๋ก = ์๋ฌ ๋ฉ์์ง
- ๊ฒฝ๋ก ํตํฉ = ์๋ฌ๋ฅผ ์ผ๋ฐ ์ถ๋ ฅ์ผ๋ก ๋ฆฌ๋ค์ด๋ ์
-
์ ์ ์ฐฝ๊ตฌ (stdin, 0)
- ์ฐํธ๋ฌผ ์ ์ = ํ๋ก๊ทธ๋จ ์ ๋ ฅ
- ์๋ ๋ถ๋ฅ๊ธฐ = ํ์ดํ๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ๋ฌ
๊ธฐ๋ณธ ๋์ ๋ฐฉ์
File Descriptor์ ์ดํด
graph LR A[ํ๋ก๊ทธ๋จ] --> B((stdin 0)) A --> C((stdout 1)) A --> D((stderr 2)) B --> E[ํค๋ณด๋] C --> F[ํฐ๋ฏธ๋] D --> F
๋ฆฌ๋ค์ด๋ ์ ์ฐ์ฐ์
>: ์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ (๋ฎ์ด์ฐ๊ธฐ)>>: ์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ (์ถ๊ฐํ๊ธฐ)2>: ์๋ฌ ๋ฆฌ๋ค์ด๋ ์ &>: ๋ชจ๋ ์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ |: ํ์ดํ๋ฅผ ํตํ ๋ฆฌ๋ค์ด๋ ์
์ค์ ์ฌ์ฉ ์์
1. ์๋ชป๋ ์ฌ์ฉ ์์
# ์์ข์ ์์ : ์๋ฌ ๋ฉ์์ง ์์ ์๋ชป๋จ
ls /์๋๋๋ ํ ๋ฆฌ 2>&1 > error.log # ์๋ฌ๊ฐ ํฐ๋ฏธ๋์ ์ถ๋ ฅ๋จ
# ์์ข์ ์์ : ํ์ผ ๊ถํ ๊ณ ๋ คํ์ง ์์
echo "log" > /var/log/app.log # ๊ถํ ์ค๋ฅ ๋ฐ์2. ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ ์์
# ์ข์ ์์ : ์ฌ๋ฐ๋ฅธ ์์๋ก ๋ฆฌ๋ค์ด๋ ์
ls /์๋๋๋ ํ ๋ฆฌ > output.log 2>&1 # ๋ชจ๋ ์ถ๋ ฅ์ด ํ์ผ๋ก ์ ์ฅ
# ์ข์ ์์ : ๊ถํ ๊ณ ๋ ค
sudo bash -c 'echo "log" > /var/log/app.log'3. ์ค์ฉ์ ์ธ ์คํฌ๋ฆฝํธ ์์
#!/bin/bash
# ๋ก๊ทธ ํ์ผ ์ค์
exec 1> >(logger -s -t $(basename $0)) 2>&1
# ์๋ฌ ์ฒ๋ฆฌ ํจ์
error_handler() {
local line_no=$1
local error_msg=$2
echo "Error on line ${line_no}: ${error_msg}"
}
trap 'error_handler ${LINENO} "$BASH_COMMAND"' ERR
# ์ค์ ์์
์ํ
echo "์์
์์"
some_command
echo "์์
์๋ฃ"๊ณ ๊ธ ํ์ฉ๋ฒ
Performance ์ต์ ํ
# ๋ฒํผ๋ง ํ์ฉ
dd if=/dev/zero of=/dev/null bs=1M count=1000 2>&1 | tee performance.log
# ๋น๋๊ธฐ ๋ก๊น
exec 1> >(logger -s -t "ASYNC_LOG") 2>&1Security ๊ณ ๋ ค์ฌํญ
# ์์ ํ ๋ก๊ทธ ํ์ผ ์์ฑ
install -m 600 /dev/null app.log
exec 1>>app.log 2>&1
# ๋ฏผ๊ฐํ ์ถ๋ ฅ ํํฐ๋ง
grep -v "password" < input.log > filtered.log 2>&1์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ์ ํด๊ฒฐ๋ฐฉ์
1. ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋์
์ฆ์:
# ์ฆ์: ์ด๋ฆฐ ํ์ผ์ด ๋๋ฌด ๋ง์
-bash: /dev/tcp/host/port: Too many open filesํด๊ฒฐ:
# ํ์ฌ ์ ํ ํ์ธ
ulimit -n
# ์ ํ ์ฆ๊ฐ
ulimit -n 4096
# ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ ๋ฆฌ
exec 3>&- # ์ฌ์ฉํ์ง ์๋ FD ๋ซ๊ธฐ2. ๋ก๊ทธ ํ์ผ ๊ถํ ๋ฌธ์
์ฆ์:
-bash: app.log: Permission deniedํด๊ฒฐ:
# ๋๋ ํ ๋ฆฌ ๊ถํ ํ์ธ
ls -ld /var/log/
# ๋ก๊ทธ ํ์ผ ์์ฑ ๋ฐ ๊ถํ ์ค์
sudo install -m 664 -o $USER -g syslog /dev/null /var/log/app.log์ฃผ์์ฌํญ
์์คํ ๋ฆฌ์์ค
- ๋ก๊ทธ ๋กํ ์ด์ ์ค์ ํ์
- ๋์คํฌ ๊ณต๊ฐ ๋ชจ๋ํฐ๋ง
- ํ์ผ ๋์คํฌ๋ฆฝํฐ ์ ํ ๊ณ ๋ ค
๋ฐ์ดํฐ ์์ ์ฑ
- ์ค์ ๋ก๊ทธ ๋ฐฑ์ ๊ตฌ์ฑ
- ๋์ ์ ๊ทผ ์ ๋ฝ ๋ฉ์ปค๋์ฆ ์ฌ์ฉ
- ๋ก๊ทธ ํ์ผ ๊ถํ ์ ์ ํ ์ค์
๊ฒฐ๋ก
Linux์ ์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ ์ ๊ฐ๋ ฅํ๋ฉด์๋ ์ ์ฐํ ๊ธฐ๋ฅ์ด๋ค. ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ์ ์ํด:
- File descriptor์ ๋์ ์๋ฆฌ ์ดํด
- ์ ์ ํ ๊ถํ๊ณผ ๋ณด์ ์ค์
- ์์คํ ๋ฆฌ์์ค ๊ด๋ฆฌ
- ์๋ฌ ์ฒ๋ฆฌ์ ๋ก๊น ์ ๋ต ์๋ฆฝ
์ด๋ฌํ ์์๋ค์ ๊ณ ๋ คํ์ฌ ์์ ์ ์ด๊ณ ํจ์จ์ ์ธ ์์คํ ์ด์์ด ๊ฐ๋ฅํ๋ค.