Linux Cheat Sheet
GitLab 지원팀의 리눅스 정보 모음입니다. 때때로 문제 해결 시 사용하는 정보로, 투명성을 위해 여기에 나열되어 있으며 Linux 경험이 있는 사용자를 위해 제공됩니다. 현재 GitLab에서 문제가 발생하고 있다면, 이 정보를 사용하기 전에 먼저 지원 옵션을 확인해 보시기 바랍니다.
경고:
시스템 관리에 대한 지원은 GitLab 지원의 범위를 벗어납니다. GitLab 관리자는 자신이 선택한 배포판에 대한 이러한 명령어를 알고 있어야 합니다. GitLab 지원 엔지니어이라면 yum
을 apt-get
로 번역하는 참조 자료로 삼아보세요.
아래 대부분의 명령어는 어떤 배포판에서 작동하는지 표시되어 있지 않습니다. 기여는 이를 돕기 위해 환영됩니다.
시스템 명령어
배포판 정보
# Debian/Ubuntu
uname -a
lsb_release -a
# CentOS/RedHat
cat /etc/centos-release
cat /etc/redhat-release
# 이 명령은 더 많은 정보를 제공합니다
cat /etc/os-release
종료 또는 재부팅
shutdown -h now
reboot
권한
# 파일/디렉터리의 사용자:그룹 소유권 변경
chown root:git <file_or_dir>
# 파일을 실행 가능하게 하기
chmod u+x <file>
파일 및 디렉터리
# 새 디렉터리 및 모든 하위 디렉터리 생성
mkdir -p dir/dir2/dir3
# 명령어의 출력을 file.txt에 보내기 (STDOUT 없음)
ls > file.txt
# 명령어의 출력을 file.txt에 보내기 (STDOUT에도 표시)
ls | tee /tmp/file.txt
# 파일 내에서 검색 및 대체
sed -i 's/original-text/new-text/g' <filename>
모든 설정된 환경 변수 보기
env
검색
파일명
# 파일시스템에서 파일 검색
find . -name 'filename.rb' -print
# 파일 찾기
locate <filename>
# 명령어 히스토리 보기
history
# CLI 히스토리 검색
<ctrl>-R
파일 내용
# -B/A = 검색어 이전/이후 2줄 표시
grep -B 2 -A 2 search_term <filename>
# -<number> = 이전과 이후 모두 표시
grep -2 search_term <filename>
# 디렉터리의 모든 파일에서 검색 (재귀적)
grep -r search_term <directory>
# GitLab 저장소의 namespace/project/name 검색
grep 'fullpath' /var/opt/gitlab/git-data/repositories/@hashed/<repo hash>/.git/config
# *.gz 파일에서 검색하기 (zgrep 사용)
zgrep search_term <filename>
# 특정 문자열 패턴을 포함하는 행을 빠르게 찾기
fgrep -R string_pattern <filename or directory>
CLI
# 명령어 히스토리 보기
history
# 'his'로 시작하는 마지막 명령어 실행 (최소 3글자)
!his
# 명령어 히스토리에서 검색
<ctrl>-R
# sudo로 마지막 명령어 실행
sudo !!
자원 관리
메모리, 디스크 및 CPU 사용량
# 디스크 공간 정보. '-h'는 사람이 읽기 쉬운 값으로 제공
df -h
# 현재 디렉터리의 각 파일/디렉터리 및 내용의 크기
du -hd 1
# 또는 다음과 같이 사용
du -h --max-depth=1
# 특정 크기(k, M, G)보다 큰 파일 찾아서 나열
# 정확한 크기는 +, 미만은 -
find / -type f -size +100M -print0 | xargs -0 du -hs | sort -h
# 시스템의 여유 메모리 찾기
free -m
# 메모리/CPU를 사용하는 프로세스 및 로드 평균 확인
# 로드 평균은 1/CPU를 나타냄 (1, 5, 15분)
top -o %MEM
top -o %CPU
Strace
# 프로세스의 strace
strace -tt -T -f -y -yy -s 1024 -p <pid>
# -tt 마이크로초 정확도를 가진 타임스탬프 표시
# -T 각 syscall에 소요된 시간 표시
# -f fork된 모든 자식 프로세스도 추적
# -y 파일 핸들에 연결된 경로 표시
# -yy 소켓 및 디바이스 파일 핸들 세부 정보 표시
# -s 이벤트에 대해 표시할 최대 문자열 길이
# -o 출력 파일
# 모든 puma 프로세스에 strace 실행
ps auwx | grep puma | awk '{ print " -p " $2}' | xargs strace -tt -T -f -y -yy -s 1024 -o /tmp/puma.txt
strace는 실행 중에 시스템 성능에 중대한 영향을 미칠 수 있음에 유의하십시오.
Strace 자료
- 빠른 안내를 위한 strace zine 참조
- Brendan Gregg의 자세한 strace 사용 방법 참조
- GitLab을 이해하기 위해 strace를 사용하는 GitLab Unfiltered 비디오 시리즈 확인
Strace Parser 도구
우리의 strace-parser 도구는 strace
출력의 고수준 요약을 제공하는 데 사용할 수 있습니다. 이는 strace -C
와 유사하지만 훨씬 더 자세한 통계를 제공합니다.
MacOS와 Linux 실행 파일은 여기에서 사용할 수 있습니다. 또는 Rust 컴파일러를 보유하고 있다면 소스에서 빌드할 수도 있습니다.
도구 사용 방법
먼저 도구를 summary
플래그와 함께 실행하여 주요 프로세스의 작업 시간을 기준으로 한 요약을 얻습니다. 또한 -s
또는 --sort
플래그를 사용하여 총 시간, 시스템 호출 횟수, PID #, 및 자식 프로세스의 횟수를 기준으로 정렬할 수 있습니다. 결과 횟수는 기본적으로 25개의 프로세스이지만 -c
/--count
옵션을 사용하여 변경할 수 있습니다. 자세한 내용은 --help
를 참조하세요.
$ ./strace-parser sidekiq_trace.txt summary -c15 -s=pid
상위 15개 PID 기준
-----------
pid actv (ms) wait (ms) user (ms) total (ms) % of actv syscalls children
------- ---------- ---------- ---------- ---------- --------- --------- ---------
16706 0.000 0.000 0.000 0.000 0.00% 0 0
16708 0.000 0.000 0.000 0.000 0.00% 0 0
16716 0.000 0.000 0.000 0.000 0.00% 0 0
16717 0.000 0.000 0.000 0.000 0.00% 0 0
16718 0.000 0.000 0.000 0.000 0.00% 0 0
16719 0.000 0.000 0.000 0.000 0.00% 0 0
16720 0.389 9796.434 1.090 9797.912 0.02% 16 0
16721 0.000 0.000 0.000 0.000 0.00% 0 0
16722 0.000 0.000 0.000 0.000 0.00% 0 0
16723 0.000 0.000 0.000 0.000 0.00% 0 0
16804 0.218 11099.535 1.881 11101.634 0.01% 36 0
16813 0.000 0.000 0.000 0.000 0.00% 0 0
16814 1.740 11825.640 4.616 11831.996 0.10% 57 0
16815 2.364 12039.993 7.669 12050.026 0.14% 80 0
16816 0.000 0.000 0.000 0.000 0.00% 0 0
PID 수: 93
실제 시간: 0분 12.287초
사용자 시간: 0분 1.474초
시스템 시간: 0분 1.686초
요약을 기반으로 특정 프로세스의 시스템 호출의 세부 정보를 보거나 정렬된 목록을 보기 위해 -p
/--pid
또는 -s
/--stats
플래그를 사용할 수 있습니다. --stats
는 summary와 동일한 정렬 및 결과 옵션을 사용합니다.
./strace-parser sidekiq_trace.txt p 16815
PID 16815
80개의 시스템 호출, 활동 시간: 2.364밀리초, 사용자 시간: 7.669밀리초, 총 시간: 12050.026밀리초
시작 시간: 22시 46분 14.830267초 종료 시간: 22시 46분 26.880293초
시스템 호출 횟수 총 시간 (밀리초) 최대 시간 (밀리초) 평균 시간 (밀리초) 최소 시간 (밀리초) 오류
----------------- -------- ---------- ---------- ---------- ---------- --------
futex 5 10100.229 5400.106 2020.046 0.022 ETIMEDOUT: 2
restart_syscall 1 1939.764 1939.764 1939.764 1939.764 ETIMEDOUT: 1
getpid 33 1.020 0.046 0.031 0.018
clock_gettime 14 0.420 0.038 0.030 0.021
stat 6 0.277 0.072 0.046 0.031
read 6 0.170 0.036 0.028 0.020
openat 3 0.126 0.045 0.042 0.038
close 3 0.099 0.034 0.033 0.031
lseek 3 0.089 0.035 0.030 0.021
ioctl 3 0.082 0.033 0.027 0.023 ENOTTY: 3
fstat 3 0.081 0.034 0.027 0.022
---------------
PID 16815의 가장 오래 걸린 파일 오픈 시간:
시간 (밀리초) 타임스탬프 오류 파일 이름
---------- --------------- --------------- ---------
0.045 22시 46분 16.771318초 - /opt/gitlab/embedded/service/gitlab-rails/config/database.yml
0.043 22시 46분 26.877954초 - /opt/gitlab/embedded/service/gitlab-rails/config/database.yml
0.038 22시 46분 22.174610초 - /opt/gitlab/embedded/service/gitlab-rails/config/database.yml
위 예시에서는 PID 16815
에서 파일이 더 오래 열리는 데 걸린 시간을 확인할 수 있습니다.
결과에서 특별한 점이 없을 때 더 많은 컨텍스트를 얻는 좋은 방법은 고객이 수행한 작업을 실행하는 동안 자체 GitLab 인스턴스에서 strace
를 실행하고 두 결과의 요약을 비교한 후 차이점을 파악하는 것입니다.
open 시스템 콜에 대한 통계
다양한 구성에서 파일에 액세스하는 ‘open’ 및 ‘openat’ 호출의 대략적인 숫자입니다. 느린 스토리지는 Gitaly에서 ‘DeadlineExceeded’ 오류를 일으킬 수 있습니다.
또한 이 항목에서 핸드북을 참조하여 파일 시스템 성능을 확인할 수 있는 고객들을 위한 빠른 테스트를 확인하세요.
strace
에서의 타이밍 정보는 종종 다소 부정확할 수 있으므로
작은 차이는 중요하지 않다고 간주해야 합니다.
설정 | 액세스 시간 |
---|---|
EFS | 10 - 30 ms |
로컬 스토리지 | 0.01 - 1 ms |
네트워킹
포트
# 포트를 수신 대기 중인 프로그램 찾기
netstat -plnt
ss -plnt
lsof -i -P | grep <포트>
인터넷/DNS
# 도메인 IP 주소 표시
dig +short example.com
nslookup example.com
# 특정 네임서버를 사용하여 DNS 확인
# 8.8.8.8 = google, 1.1.1.1 = cloudflare, 208.67.222.222 = opendns
dig @8.8.8.8 example.com
nslookup example.com 1.1.1.1
# 호스트 제공업체 찾기
whois <ip_address> | grep -i "orgname\|netname"
# 리디렉션과 함께 Curl 헤더
curl --head --location "https://example.com"
# 네트워크에서 호스트 접근 가능한지 테스트. `ping6`은 IPv6 네트워크에서 작동합니다.
ping example.com
# 호스트로 이어지는 경로 표시. `traceroute6`은 IPv6 네트워크에서 작동합니다.
traceroute example.com
mtr example.com
# 네트워크 인터페이스의 세부 정보 목록
ip address
# 로컬 DNS 설정 확인
cat /etc/hosts
cat /etc/resolv.conf
systemd-resolve --status
# 호스트와의 트래픽 캡처
sudo tcpdump host www.example.com
패키지 관리
# Debian/Ubuntu
# 패키지 목록
dpkg -l
apt list --installed
# 설치된 패키지 찾기
dpkg -l | grep <package>
apt list --installed | grep <package>
# 패키지 설치
dpkg -i <package_name>.deb
apt-get install <package>
apt install <package>
# CentOS/RedHat
# 패키지 설치
yum install <package>
dnf install <package> # RHEL/CentOS 8+
rpm -ivh <package_name>.rpm
# 설치된 패키지 찾기
rpm -qa | grep <package>
로그
# 'n'은 인쇄할 줄의 수입니다.
로그 파일에서 마지막 줄 인쇄
tail -n /path/to/log/file