로그 파일 생성 없이, 세션 종료 없이 백그라운드 실행

nohup {실행파일} 1>/dev/null 2>&1 &

실행중인 프로세스 확인

ps -ef | grep {패턴}
ps aux | grep {패턴}
  • ps -ef = System V 스타일. 모든 프로세스를 full format. PPID(부모) 포함.
  • ps aux = BSD 스타일. CPU·메모리 사용량 중심.
  • 둘 다 grep 자기 자신도 결과에 잡힘 (밑 nginx 예시 참고). 피하려면 ps -ef | grep "[n]ginx" (대괄호 트릭) 또는 pgrep -af nginx.

ps -ef 컬럼

컬럼의미
UID사용자 (소유자)
PID프로세스 ID
PPIDparent PID — 누가 fork 했나
CCPU 사용률 (대략, deprecated)
STIME시작 시각
TTY묶인 터미널 (? = 데몬, TTY 없음)
TIME누적 CPU 시간
CMD전체 명령줄

ps aux 컬럼

컬럼의미
USER사용자
PID프로세스 ID
%CPUCPU 사용률 (실시간 비율)
%MEM메모리 사용률
VSZ가상 메모리 크기 (KB)
RSS실제 메모리 = Resident Set Size (KB)
TTYTTY
STAT상태 (S sleep, R running, Z zombie, + foreground, s session leader)
START시작 시각
TIME누적 CPU 시간
COMMAND명령

언제 뭘 쓰나

  • -ef = “프로세스 인벤토리 + 부모-자식 관계” 파악. trees / supervisor 구조 분석.
  • aux = “리소스 누가 먹나” 분석. %CPU/%MEM/RSS 정렬해서 무거운 놈 찾기.

예시 — nginx 가 master/worker 구조로 도는 모습

root@lima-default:~# systemctl start nginx.service
 
root@lima-default:~# ps -ef | grep nginx
root       14452       1  0 20:55 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data   14453   14452  0 20:55 ?        00:00:00 nginx: worker process
www-data   14454   14452  0 20:55 ?        00:00:00 nginx: worker process
www-data   14456   14452  0 20:55 ?        00:00:00 nginx: worker process
www-data   14457   14452  0 20:55 ?        00:00:00 nginx: worker process
root       14460    1816  0 20:56 pts/1    00:00:00 grep --color=auto nginx
 
root@lima-default:~# ps aux | grep nginx
root       14452  0.0  0.0  14692  2388 ?        Ss   20:55   0:00 nginx: master process /usr/sbin/nginx ...
www-data   14453  0.0  0.1  16412  4844 ?        S    20:55   0:00 nginx: worker process
www-data   14454  0.0  0.1  16412  4844 ?        S    20:55   0:00 nginx: worker process
www-data   14456  0.0  0.1  16412  4844 ?        S    20:55   0:00 nginx: worker process
www-data   14457  0.0  0.1  16412  4780 ?        S    20:55   0:00 nginx: worker process
root       14462  0.0  0.0   6904  1900 pts/1    S+   20:56   0:00 grep --color=auto nginx

읽는 법:

  • master (PID 14452, USER=root) + worker 4 개 (USER=www-data, PPID=14452). 모두 master 가 fork 한 자식. PPID 컬럼이 그 관계를 보여줌.
  • 왜 권한이 다른가 — 80/443 같은 1024 미만 포트는 root 만 bind 가능 (전통적 Unix). 그래서 master 가 root 로 시작 → 포트 bind → worker fork → worker 는 www-data 로 권한 강등(setuid). 보안 best practice = 실제 요청 처리는 비특권 user.
  • STAT=Ss master 의 s = session leader. worker 는 S (sleeping, idle).
  • RSS 비교 — master 2388K vs worker 각 4844K. worker 가 실제 작업 코드·연결 상태를 들고 있어서 더 큼.
  • TTY=? = 데몬이라 터미널 없음. grep 자신만 pts/1 (내 셸).
  • 마지막 grep --color=auto nginx 줄 = grep 명령이 자기 자신을 잡음. 매번 보임. 위 트릭 (grep "[n]ginx") 으로 회피 가능.
  • USER=www-data 와 파일 권한의 user/group/other 관계 → 자세한 건 04. Linux Permissions 노트 참고.

특정 PORT 사용 프로세스 확인

lsof -i:8080

로그 파일 확인

tail -f {로그 파일 경로}

파일 작성

cat << EOF > /home/ec2-user/{파일이름}
#!/usr/bin/python
...
EOF

명령어 cheat sheet


한 줄 요약. 깊이 있는 설명은 각 카테고리별 노트 참고.

파일·디렉터리

명령설명예시
ls파일·디렉터리 목록ls -al
cd디렉터리 이동cd /path
pwd현재 디렉터리 출력pwd
mkdir디렉터리 생성mkdir -p a/b/c
rm파일·디렉터리 삭제rm -rf dir
cp복사cp src dst, cp -r dir1 dir2
mv이동·이름 변경mv old new
touch빈 파일 생성 / mtime 갱신touch file
cat파일 출력 (concat)cat file, cat a b > c
ln링크 생성 (-s 심볼릭)ln -s target link
basename경로에서 파일명만basename /a/b/c.txt → c.txt
dirname경로에서 디렉터리만dirname /a/b/c.txt → /a/b

텍스트·내용 보기

명령설명예시
head파일 앞 N 줄 (기본 10)head -20 file
tail파일 뒤 N 줄. -f 로 followtail -f log
grep패턴 검색 (정규표현)grep -rn "pattern" .
sed스트림 편집 (치환·삭제)sed 's/old/new/g' file
awk컬럼·패턴 처리awk '{print $1}' file
sort정렬sort -k2 file
uniq중복 제거 (정렬된 입력 필요)sort file | uniq -c
wc줄·단어·문자 수wc -l file
cmp두 파일 바이트 비교cmp f1 f2
diff두 파일 줄 비교diff -u f1 f2
echo텍스트 출력echo "hi"
tee입력을 stdout + 파일에 동시cmd | tee log

파일 검색

명령설명예시
find파일·디렉터리 검색find . -name "*.py" -type f
whereis명령어의 binary·man·src 위치whereis ls
lsof열린 파일·소켓 조회lsof -i:8080, lsof -p <pid>

아카이브·압축

명령설명예시
tar아카이브 생성·해제tar -czvf x.tgz dir/, tar -xvf x.tgz
gzip / gunzipgzip 압축·해제gzip file, gunzip file.gz
unzipzip 압축 해제unzip x.zip

권한·소유자 (자세히 = 04. Linux Permissions)

명령설명예시
chmod권한 변경chmod 644 file, chmod -R 750 dir
chown소유자·그룹 변경chown user:group file
chgrp그룹만 변경chgrp group file

사용자·그룹 관리

명령설명예시
whoami현재 사용자whoami
su사용자 전환 (- 로 환경까지 갈음)su - other
sudosuperuser 권한으로 실행sudo apt update
useradd사용자 생성sudo useradd alice
passwd패스워드 변경passwd alice
groupadd그룹 생성sudo groupadd devs
usermod사용자 수정 (그룹 추가 등)sudo usermod -aG devs alice
groups사용자 소속 그룹 표시groups alice

사용자 계정 구분

  • 일반 사용자
    • 자신의 홈 디렉터리 외에는 제한된 권한을 가짐
    • UID = 1000~
  • root(관리자 계정)
    • 시스템 사용에 대한 모든 권한을 가짐
    • UID = 0
  • 시스템 계정
    • 특정 프로그램 실행을 위해 사용
    • 보안 목적으로 사용
    • 로그인을 할 수 없음

su

su                  # root 계정으로 전환
su -l               # root 계정으로 전환 + 사용자 환경 및 작업 디렉터리 변경
su <username>       # username 계정으로 전환
su -l <username>    # username 계정으로 전환 + 사용자 환경 및 작업 디렉터리 변경
su -c 'ls -l /root' # root 계정으로 명령어 실행
  • substitute user, 특정 사용자로 전환하는 명령
  • 해당 사용자의 비밀번호를 알아야 실행 가능
  • root 로 실행 시 타깃 사용자의 비밀번호를 몰라도 됨
  • 옵션
    • default : 사용자만 변경
    • -l / --login : 지정된 계정으로 로그인 셸을 실행, 환경변수를 초기화하고(HOME SHELL USER LOGNAME PATH) 해당 계정의 홈 디렉터리로 이동
    • -c / --command : 셸 명령어 1개만 실행하고 종료, 대상 사용자(생략 시 root)의 암호가 필요

sudo

sudo [-u username] command # username 계정으로 명령 실행
sudo command               # root 계정으로 명령 실행
 
# /etc/sudoers
...
# User privilege specification
root    ALL=(ALL:ALL) ALL
 
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
 
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
 
# See sudoers(5) for more information on "@include" directives:
 
@includedir /etc/sudoers.d
  • root 또는 다른 사용자로 명령 실행
  • su 명령과 달리 본인의 암호만 필요, root 혹은 다른 사용자의 비밀번호를 몰라도 됨
  • 단, 관리자가 /etc/sudoers 파일에 권한을 설정해둬야 함

프로세스·시스템 (자세히 = 06. Linux Processes & Systemd)

명령설명예시
ps프로세스 목록ps aux, ps -ef
kill시그널 전송 (기본 SIGTERM=15)kill <pid>, kill -9 <pid>
top실시간 프로세스·자원 모니터top
free메모리 사용량free -h
uptime가동 시간 + load averageuptime
systemctlsystemd 서비스 제어systemctl start nginx
journalctlsystemd 로그 조회journalctl -u nginx -f

디스크·파일시스템 (자세히 = 05. Linux Filesystem)

명령설명예시
df파일시스템별 디스크 사용량df -h
du디렉터리 크기du -sh dir/
mount / umount파일시스템 마운트·언마운트mount /dev/sdb1 /mnt, umount /mnt
lsblk블록 디바이스 목록 (트리)lsblk
fdisk파티션 관리sudo fdisk /dev/sdb

mount

# mount -t [파일 시스템 종류] [마운트 할 장치 파티션] [마운트할 위치]
blkid | grep /dev/sdb1
mkfs.ext4 /dev/sdb1 # /dev/sdb1 파티션을 ext4 파일 시스템으로 포맷
blkid | grep /dev/sdb1
mount -t ext4 /dev/sdb1 /mp
df -h
 
# umount [마운트 위치]
fuser /mp
umount /mp # 마운트 해제
df -h
  • mount 란 포맷이 완료된 파티션을 사용자들이 직접 접근할 수 있도록 디렉터리와 연결하는 과정
  • mount 명령, /etc/mtab 파일, /proc/mounts 파일로 마운트 정보를 확인할 수 있음
  • 최근 배포판은 /etc/mtab 이 /proc/self/mounts 심볼릭 링크라 둘의 내용은 같고, mount 명령은 같은 정보를 다른 형식으로 보여줌

/etc/fstab

# /etc/fstab
# 파일 시스템 장치 | 마운트 포인트 | 파일 시스템 | 옵션 | 덤프 | 파일 체크
LABEL=cloudimg-rootfs   /        ext4   discard,commit=30,errors=remount-ro     0 1
LABEL=BOOT      /boot   ext4    defaults        0 2
LABEL=UEFI      /boot/efi       vfat    umask=0077      0 1
mount0  /Users/meatsby  virtiofs        ro,nofail,comment=cloudconfig   0       0
 
# /etc/fstab 수정 적용
mount -a
  • mount 명령어는 재부팅 시 초기화 됨
  • /etc/fstab 에 자동 마운팅 설정
    • 파일 시스템 장치 : blkid 로 확인할 수 있는 UUID 값 또는 실제 장치명 지정
    • 마운트 포인트 : 마운트될 위치 지정
    • 파일 시스템 : 장치의 파일 시스템 종류 지정
    • 옵션 : 마운트 옵션 지정
    • 덤프 : 덤프 여부 지정
      • 0 : 백업 하지 않음
      • 1 : 백업 수행
    • 파일 체크 : 부팅 시 fsck 점검 순서 지정
      • 0 : 점검하지 않음
      • 1 : 가장 먼저 점검, 루트 파일 시스템에 지정
      • 2 : 1 이후에 점검, 루트가 아닌 파일 시스템에 지정

네트워킹 (자세히 = 07. Linux Networking)

명령설명예시
ifconfigNIC 정보 (legacy net-tools)ifconfig
ipNIC·라우팅·ARP (iproute2 현대)ip addr, ip route
pingICMP echo — 호스트 살아있나ping google.com
traceroute경로 추적traceroute google.com
netstat / ss소켓·커넥션 (ss 가 현대 표준)ss -tulpn
iptables방화벽 규칙 (legacy; 현대 = nftables)sudo iptables -L
hostname호스트네임 출력·설정hostname
ncnetcat — raw TCP/UDP, 포트 probenc -zv host 22
wgetURL 다운로드 (재귀·resume 지원)wget https://...
curlHTTP/HTTPS 등 클라이언트curl -LO URL, curl -X POST

원격 (SSH) (자세히 = 08. Linux SSH)

명령설명예시
ssh원격 셸 접속ssh user@host, ssh -i key.pem ...
scpSSH 위 파일 복사scp file user@host:/path
ssh-keygenSSH 키 쌍 생성ssh-keygen -t ed25519
ssh-copy-idpub key 를 서버 authorized_keys 에 추가ssh-copy-id user@host

패키지 관리

명령설명예시
apt / apt-getDebian·Ubuntu 패키지 매니저sudo apt install pkg
yum / dnfRHEL·CentOS·Fedora 매니저sudo dnf install pkg

시스템 관리

명령설명예시
shutdown시스템 종료·예약 종료sudo shutdown -h now, shutdown -r +10
reboot재시작sudo reboot
uname시스템 정보 (커널·아키텍처)uname -a
date현재 시각 출력·포맷date +"%Y-%m-%d %H:%M:%S"

셸·도움말

명령설명예시
man매뉴얼 페이지man ls
history명령어 히스토리history, history | grep ssh
exit셸 종료exit

mv * 하면 생기는 일


meatsby@lima-default:~$ ls
t1.txt  t2.txt  t3.txt  z
 
meatsby@lima-default:~$ mv *
 
meatsby@lima-default:~$ ls
z
 
meatsby@lima-default:~$ ls z
t1.txt  t2.txt  t3.txt
  • 해당 디렉터리에 있는 모든 파일 및 디렉터리가 맨 마지막 디렉터리 안으로 이동한다.
meatsby@lima-default:~$ ls
t1.txt  t2.txt  t3.txt
 
meatsby@lima-default:~$ mv *
mv: target 't3.txt': Not a directory
  • 디렉터리 내 모든것이 파일일 경우 위와 같이 마지막 파일이 디렉터리가 아니라는 예외가 발생한다.

셸·파일 시스템 메모


심볼릭 링크

ln [option] [source] [link]
ln -s  ~/Library/Mobile\ Documents/iCloud\~md\~obsidian/Documents/Vault\ Name ~/path/to/local
  • link 의 약자인 ln 명령어를 통해 링크파일 생성 가능.
  • Obsidian 을 사용할 경우 iCloud Drive 를 통해 기기간 연동이 가능한데 로컬에서의 변경사항을 iCloud Drive 내에 링크파일을 생성해서 동기화·백업을 수행할 수 있음.

set -exuo pipefail

set -exuo pipefail

쉘 스크립트의 오동작·버그를 줄이는 옵션 묶음.

  • set -e (errexit) = 오류 발생 시 스크립트 종료.
  • set -x (xtrace) = 실행되는 명령어와 인수들 출력.
  • set -u (nounset) = 설정되지 않은 변수 사용 시 종료.
  • set -o pipefail = 파이프 사용 시 오류 코드를 이어 받음.

mkdir -p

mkdir -p /not_yet_parent/target_dir
  • -p (parents) = 필요한 상위 디렉토리 자동 생성.

Insufficient space for shared memory file


디스크 용량 확인

df -h

메모리 확인

free -m
  • 사실 /proc/meminfo 내용

경로 메모리 확인

sudo du -h --max-depth=1

/dev/tcp 로 외부 바이너리 없이 TCP 포트 헬스체크


while true; do
  printf "%s " "$(date '+%H:%M:%S')"
  timeout 5 bash -c 'cat < /dev/null > /dev/tcp/github.com/22' 2>/dev/null && echo "OK" || echo "FAIL"
  sleep 5
done
14:23:01 OK
14:23:07 OK
14:23:13 FAIL
14:23:19 OK

printf "%s " "$(date '+%H:%M:%S')"

  • %s = printf 포맷 문자열의 지시자. “문자열 하나를 여기 끼워 넣어라” (정수는 %d, 실수는 %f).
  • $(...) = 명령 치환. 안의 명령을 실행하고 그 stdout 결과를 문자열로 그 자리에 대체한다. date '+%H:%M:%S' 실행 결과(14:23:01)가 그대로 %s 자리에 들어감.
  • echo 대신 printf를 쓰는 이유 = echo는 기본 개행이 붙어서 시각과 OK/FAIL이 다른 줄에 찍힘. printf "%s "는 개행 없이 공백만 붙여 같은 줄에 이어 쓰기 위함.

timeout 5 bash -c 'cat < /dev/null > /dev/tcp/github.com/22'

  • /dev/tcp/HOST/PORT = 실제 파일이 아니라 bash 내장 기능. 이 경로로 리다이렉션을 여는 순간 bash 가 HOST:PORT 로 TCP connect() 를 시도한다.
  • cat < /dev/null > /dev/tcp/github.com/22 = /dev/null 의 stdin (빈 입력)을 < 으로 전달하고 cat 에서 나온 stdout 을 > 로 전달하여 /dev/tcp/github.com/22 소켓에 쓴다. 실제 데이터 전송이 목적이 아니라, 리다이렉션을 여는 행위 자체로 연결 성공 여부만 확인하는 트릭.
    • nc -z host port 와 동일한 역할을 외부 바이너리 없이 수행.
  • bash -c '...' 로 새 bash 를 띄우는 이유 = timeout은 “명령 + 인자” 하나만 실행시키는 구조라, 리다이렉션이 섞인 복합 구문(cat < ... > ...)을 직접 못 받는다. bash -c로 감싸서 전체 구문을 새 셸이 통째로 해석하게 만들고, timeout은 그 bash 프로세스 하나만 감시한다.
  • timeout 5 = 방화벽이 SYN 을 그냥 drop 하면 연결 시도가 무한 대기할 수 있어 5초 후 강제 종료.

2>/dev/null && echo "OK" || echo "FAIL"

  • >(1>)는 stdout 만, 2>는 stderr 만 리다이렉트, 서로 다른 파일 디스크립터(FD)
  • 2>/dev/null은 연결 실패 시 bash 가 내는 에러 메시지(bash: connect: Connection refused 등)만 버리고, > /dev/tcp/...로 이미 지정된 stdout 에는 영향 없음.
  • &&/||는 출력 유무가 아니라 exit code로 갈린다. timeout 5 bash -c '...'는 2>/dev/null, > /dev/tcp/... 때문에 화면에 아무것도 안 찍지만, 연결 성공 시 exit code 0(&& 발동 → OK), 실패·타임아웃 시 exit code ≠ 0(|| 발동 → FAIL)으로 분기한다.