Linux Cheat Sheet

Tier: Free, Premium, Ultimate Offering: Self-Managed

GitLab 지원팀의 리눅스 정보 모음입니다. 때때로 문제 해결 시 사용하는 정보로, 투명성을 위해 여기에 나열되어 있으며 Linux 경험이 있는 사용자를 위해 제공됩니다. 현재 GitLab에서 문제가 발생하고 있다면, 이 정보를 사용하기 전에 먼저 지원 옵션을 확인해 보시기 바랍니다.

경고:
시스템 관리에 대한 지원은 GitLab 지원의 범위를 벗어납니다. GitLab 관리자는 자신이 선택한 배포판에 대한 이러한 명령어를 알고 있어야 합니다. GitLab 지원 엔지니어이라면 yumapt-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 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