ps # 현재 터미널의 프로세스만
ps -ef # 전체 (System V 방식)
ps aux # 전체 (BSD 방식) — 하이픈 없음
ps -ef | grep httpd
pstree # 부모-자식 관계를 트리로
pgrep httpd # 이름으로 PID 찾기
형식 계열 특징 ps -efSystem V UID·PID·PPID·시작시각 ps auxBSD CPU·메모리 사용률 까지
aux에는 하이픈이 없다. BSD 방식이라 그렇다. 이 표기 차이가 문제로 나온다.
-e는 전체(every), -f는 자세히(full)라는 뜻이다.
ps -ef | head -3
# UID PID PPID C STIME TTY TIME CMD
# root 1 0 0 09:00 ? 00:00:02 /usr/lib/systemd/systemd
# root 1023 1 0 09:00 ? 00:00:00 /usr/sbin/sshd -D
ps aux | head -3
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# root 1 0.0 0.3 171820 11520 ? Ss 09:00 0:02 /usr/lib/systemd/systemd
# root 1023 0.0 0.2 15840 9216 ? Ss 09:00 0:00 /usr/sbin/sshd -D
열 뜻 어느 쪽에 있나 PPID부모 프로세스 번호 -ef에만%CPU %MEMCPU·메모리 사용률 aux에만VSZ / RSS가상 메모리 / 실제로 쓰는 메모리 크기(KB) auxSTAT프로세스 상태 문자 auxTTY연결된 터미널. ?는 터미널이 없다 는 뜻 둘 다 TIME지금까지 CPU를 쓴 시간 의 합 둘 다
부모를 알고 싶으면 ps -ef, 자원을 많이 쓰는 것을 찾으면 ps aux 다. 두 형식을 갈라 묻는 근거가 이 열의 차이다.
TIME은 실행된 지 얼마나 됐는지가 아니다. 종일 떠 있어도 일을 안 했으면 0:00 이다.
BSD 옵션 뜻 a터미널에 연결된 모든 사용자 의 프로세스 u사용자 중심 형식 — 소유자와 CPU·메모리 사용률을 함께x터미널이 없는 프로세스(데몬)까지
셋을 다 써야 "시스템 전체"가 된다. ps a만으로는 데몬이 빠진다.
그 밖에 ps -u alice(그 사용자 것만), ps -p 1234(그 PID만), ps -l (우선순위 PRI·NI 열 포함)을 쓴다.
ps -ef | grep httpd 의 결과에는 grep httpd 자신 도 한 줄 끼어 나온다. pgrep httpd 는 PID만 깔끔하게 준다.
top # 실시간 모니터링, q 로 종료
top -d 2 # 2초마다 갱신
top - 10:15:02 up 1:15, 2 users, load average: 0.08, 0.03, 0.01
Tasks: 142 total, 1 running, 141 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.2 us, 0.5 sy, 0.0 ni, 98.1 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3736.5 total, 2105.3 free, 820.4 used, 810.8 buff/cache
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1310 mysql 20 0 1794188 395220 35840 S 1.3 10.3 0:42.17 mysqld
2314 user 20 0 24424 5376 3456 S 0.0 0.1 0:00.05 bash
위치 읽는 법 1행 load average 최근 1분 · 5분 · 15분 의 평균 부하 2행 Tasks 전체 프로세스 수와 상태별 개수. zombie 칸에서 좀비 수 를 바로 본다 3행 %Cpu(s) us 사용자 프로그램, sy 커널, id 쉬는 비율 , wa 입출력 대기PR / NI우선순위 / nice 값 S상태 문자 (아래 표)
위쪽 요약 + 아래쪽 프로세스 목록 두 부분으로 되어 있다. 기본으로 CPU를 많이 쓰는 순 으로 정렬되어 범인이 맨 위에 온다.
top -p 1234(그 PID만), top -u alice(그 사용자 것만)처럼 좁혀 볼 수 있다.
키 하는 일 q종료 k프로세스 종료(kill) M메모리 사용률순 정렬PCPU 사용률순 정렬rnice 값 변경(renice) u특정 사용자의 프로세스만 1CPU 코어별로 나눠 보기 h도움말
ps는 한 번 찍는 사진, top은 계속 움직이는 화면 이다. 이 대비를 기억한다.
정렬 키 M·P는 대문자 , 조작 키 k·r·q는 소문자다.
명령 보여 주는 것 ps그 순간의 프로세스 목록 top실시간으로 갱신되는 목록과 시스템 요약 pstree부모-자식 트리 pgrep이름에 맞는 프로세스의 PID jobs현재 셸 의 백그라운드·정지 작업
문자 상태 R실행 중(Running) S대기(Sleeping) Z좀비 T정지(Stopped) D중단 불가 대기
ps aux의 STAT 칸에는 문자가 더 붙기도 한다. Ss의 s는 세션 리더, R+의 +는 포그라운드 , <는 높은 우선순위, N은 낮은 우선순위다. 첫 글자가 상태다.
kill은 시그널을 보내는 명령 이다. 이름 때문에 오해하기 쉽다.
번호 이름 하는 일 1 SIGHUP 터미널 끊김. 데몬은 설정 다시 읽기 로 쓴다 2 SIGINT 인터럽트 — Ctrl+C 와 같다 9 SIGKILL 강제 종료. 무시할 수 없다 15 SIGTERM 정상 종료 요청. kill의 기본값 18/19 SIGCONT / SIGSTOP 재개 / 정지
kill 1234 # 15번(TERM) 을 보낸다 — 기본값
kill -9 1234 # 강제 종료
kill -15 1234 # 정상 종료 (kill 1234 와 같다)
kill -l # 시그널 목록
killall httpd # 이름으로 전부 종료
pkill -u alice # 사용자 단위로 종료
9와 15의 차이 가 핵심이다. 15는 "정리하고 끝내라"는 요청 이라 프로그램이 저장 등 마무리를 할 수 있다. 9는 커널이 즉시 없애 버려 무시할 수 없지만 데이터가 손상될 수 있다. 먼저 15, 안 되면 9 가 순서다.
kill -9 1234 # 번호로
kill -KILL 1234 # 이름으로 (SIG 생략)
kill -SIGKILL 1234 # 이름 전체로
kill -s KILL 1234 # -s 옵션으로
넷 다 같은 명령이다. 문제에는 번호와 이름이 섞여 나오므로 1·2·9·15는 양쪽으로 다 알아야 한다.
가로채거나 무시할 수 없는 시그널은 SIGKILL(9)과 SIGSTOP(19) 둘뿐 이다. Ctrl+Z가 보내는 것은 19가 아니라 SIGTSTP(20) 이며 이것은 프로그램이 처리할 수 있다.
시그널은 자기 프로세스에만 보낼 수 있다. 남의 것에 보내면 Operation not permitted 가 나온다. root는 모두에게 보낼 수 있다.
데몬의 설정을 고친 뒤 kill -HUP PID (= kill -1 PID)를 보내면 프로세스를 끝내지 않고 설정만 다시 읽게 할 수 있다.
명령 대상을 고르는 기준 예 killPID (또는 %작업번호)kill 1234killall프로세스 이름 — 같은 이름 전부killall httpdpkill이름의 일부 , 사용자 등 조건 pkill -u alicepgreppkill과 같은 조건으로 찾기만 한다pgrep -u alice
kill에 이름을 주거나 killall에 PID를 주면 안 된다. "PID를 모를 때 이름으로 종료하는 명령"이 killall이다.
셋 다 기본 시그널은 15번 이다. 강제로 끝내려면 killall -9 httpd 처럼 똑같이 번호를 준다.
nice -n 10 명령 # 우선순위를 낮춰 실행
renice 5 -p 1234 # 실행 중인 프로세스의 값 변경
nice # 0 ← 지금 셸의 nice 값
nice -n 10 ./backup.sh & # 현재 값에 10 을 더해 실행
ps -l
# F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
# 0 S 1000 2314 2313 0 80 0 - 6106 do_wai pts/0 00:00:00 bash
# 0 S 1000 3520 2314 0 90 10 - 1827 do_wai pts/0 00:00:00 backup.sh
renice 15 -p 3520
# 3520 (process ID) old priority 10, new priority 15
구분 nice renice 대상 새로 시작하는 명령이미 실행 중인 프로세스숫자의 뜻 현재 값에 더할 양 바꿀 값 그 자체 대상 지정 뒤에 명령을 적는다 -p PID, -u 사용자, -g 그룹생략하면 nice 명령 은 10을 더한다 —
nice는 상대값, renice는 절댓값 이다. nice 값이 10인 프로세스에 renice 15 를 하면 25가 아니라 15 가 된다.
ps -l 의 NI가 nice 값, PRI가 커널이 실제로 쓰는 우선순위 다. NI가 10 늘자 PRI도 80에서 90으로 늘었다. 둘 다 숫자가 클수록 뒤로 밀린다.
옛 표기에서는 -n 없이 nice -10 명령 이라고도 쓴다. 이때 하이픈은 옵션 표시라 값은 +10 이다. 음수를 주려면 nice --10 명령 처럼 하이픈이 둘이 된다.
-20 ◄──────────────────────► 19
높음 우선순위 낮음
0
(기본값)
값이 작을수록 우선순위가 높다. 직관과 반대라 헷갈린다. nice는 "양보" 라고 생각하면 된다 — 많이 양보할수록(값이 클수록) 뒤로 밀린다.
범위는 -20 ~ 19 , 기본값은 0 이다.
우선순위를 높이는 것(음수)은 root만 할 수 있다. 일반 사용자는 낮추기만 가능하다.
일반 사용자는 자기 프로세스의 값을 올릴 수만 있다. 한번 올린 값을 다시 내리는 것도 "우선순위를 높이는" 일이라 기본 설정에서는 허용되지 않는다.
구분 cron at 실행 횟수 주기적으로 반복 한 번만 데몬 crondatd설정 crontab -eat 시각예 매일 새벽 백업 오늘 밤 10시에 한 번
* * * * * 실행할 명령
│ │ │ │ │
│ │ │ │ └── 요일 (0-7, 0과 7이 일요일)
│ │ │ └───── 월 (1-12)
│ │ └──────── 일 (1-31)
│ └─────────── 시 (0-23)
└────────────── 분 (0-59)
예 뜻 0 3 * * *매일 새벽 3시 30 2 * * 0매주 일요일 2시 30분 */10 * * * *10분마다 0 0 1 * *매월 1일 자정
필드는 5개 이고 순서는 분·시·일·월·요일 이다. 이 순서를 그대로 묻는다.
요일은 0과 7이 모두 일요일 이다.
*는 "매번", */n은 "n마다", 쉼표는 나열(1,15), 하이픈은 범위(1-5)다.
예 뜻 0 9-18 * * 1-5평일(월~금) 9시부터 18시까지 매시 정각0 0 1,15 * *매월 1일과 15일 자정 */5 9-17 * * *9시대부터 17시대까지 5분마다 0 4 * * 6매주 토요일 4시 30 6 1 1 *1월 1일 6시 30분* 3 * * *새벽 3시대에 매분 (3:00~3:59, 모두 60번)
마지막 줄이 함정이다. 분 자리를 *로 두면 "그 시각에 한 번"이 아니라 "그 시간 내내 매분" 이다. 한 번만 돌리려면 분에 숫자를 넣어 0 3 * * * 로 쓴다.
읽는 순서는 왼쪽부터 , 숫자가 박힌 칸은 "그때만", *인 칸은 "매번"이다.
일과 요일을 둘 다 숫자로 지정하면 둘 중 하나만 맞아도 실행 된다. 0 0 13 * 5 는 "13일의 금요일"이 아니라 "매월 13일, 그리고 매주 금요일"이다.
0 3 * * * /home/user/backup.sh >> /home/user/backup.log 2>&1
└── 시각 5칸 ──┘ └──────────── 실행할 명령 ────────────────┘
cron이 돌리는 작업에는 화면이 없다. 결과를 남기려면 지난주에 배운 리다이렉션으로 파일에 보낸다.
명령은 절대 경로 로 적는 것이 안전하다. cron이 쓰는 PATH는 로그인했을 때보다 좁다.
crontab -e # 편집
crontab -l # 목록 보기
crontab -r # 전부 삭제
⚠️ -r은 확인 없이 전부 지운다. -e와 키가 붙어 있어 실수하기 쉽다.
root는 crontab -u alice -l 처럼 -u로 다른 사용자의 예약을 보고 고칠 수 있다.
고친 내용은 저장하는 즉시 반영된다. crond를 다시 시작할 필요가 없다.
위치 무엇 /var/spool/cron/사용자명사용자별 crontab 이 저장되는 곳 (데비안 계열은 /var/spool/cron/crontabs/)/etc/crontab시스템 crontab /etc/cron.d/시스템 crontab을 파일별로 나눠 두는 곳 /etc/cron.hourly · daily · weekly · monthly넣어 둔 스크립트를 그 주기로 실행
# /etc/crontab
0 3 * * * root /usr/local/bin/backup.sh
└── 실행할 사용자 — 사용자 crontab 에는 없는 칸
/etc/crontab에는 시각 5칸 뒤에 사용자 이름이 하나 더 들어간다. crontab -e 로 편집하는 개인 crontab에는 이 칸이 없다.
"crontab의 필드는 5개"는 시각을 정하는 칸 을 센 것이다. 명령까지 세면 6개, /etc/crontab은 7개가 된다. 문제가 무엇을 세는지 본다.
at 22:00 # 오늘 밤 10시
at now + 1 hour # 1시간 뒤
atq # 예약 목록
atrm 3 # 3번 예약 취소
명령을 입력한 뒤 Ctrl+D 로 마친다.
사용 허가는 /etc/at.allow·/etc/at.deny , cron은 /etc/cron.allow·/etc/cron.deny 로 관리한다.
at 22:00
# warning: commands will be executed using /bin/sh
# at> /home/user/backup.sh
# at> <EOT> ← Ctrl+D 를 누른 자리
# job 3 at Wed Oct 14 22:00:00 2026
atq
# 3 Wed Oct 14 22:00:00 2026 a user
시각 표기 뜻 at 22:00오늘 22시 (이미 지났으면 내일) at 10am tomorrow내일 오전 10시 at now + 30 minutes30분 뒤 at noon / at midnight정오 / 자정 at teatime오후 4시
명령 하는 일 같은 것 atq예약 목록 보기 at -latrm 번호예약 취소 at -d 번호at -f 파일 시각명령을 파일에서 읽어 예약 —
at은 실행되고 나면 예약이 사라진다. cron처럼 남아 있지 않다. 예약을 처리하는 데몬은 atd다.
파일 상태 쓸 수 있는 사용자 allow 파일이 있다 거기 적힌 사용자만 — deny 파일은 보지 않는다allow가 없고 deny만 있다 deny에 적힌 사용자만 빼고 모두 둘 다 없다 배포판에 따라 다르다 (root만, 또는 모두)
allow가 deny보다 먼저 다. 두 파일에 같은 이름이 있으면 허용된다.
파일에는 한 줄에 사용자 이름 하나 를 적는다. root는 파일 내용과 상관없이 쓸 수 있다.
cron.allow·cron.deny 와 at.allow·at.deny 는 같은 규칙 으로 동작한다.
내일은 이번 주의 에디터와 프로세스를 한 장으로 묶어 정리한다.
ps : 실행 중인 프로세스 목록을 한 번 출력하는 명령.
top : 프로세스 상태를 실시간으로 갱신하며 보여 주는 명령.
시그널 : 프로세스에 보내는 신호. kill이 전달한다.
SIGKILL(9) : 무시할 수 없는 강제 종료 시그널.
SIGTERM(15) : 정상 종료를 요청하는 시그널. kill의 기본값이다.
nice 값 : 프로세스 우선순위. -20이 가장 높고 19가 가장 낮으며 기본은 0이다.
cron : 지정한 주기로 명령을 반복 실행하는 예약 도구. 필드가 5개다.
at : 지정한 시각에 명령을 한 번만 실행하는 예약 도구.
📝 연습 문제 선택지를 클릭하면 정답·해설이 펼쳐집니다.
다음 중 프로세스를 강제로 종료할 때 사용하는 시그널 번호로 알맞은 것은?
다음 중 crontab 설정의 다섯 개 필드를 순서대로 바르게 나열한 것은?
A 시 분 일 월 요일 B 분 시 일 월 요일 C 분 시 월 일 요일 D 요일 분 시 일 월 다음 중 프로세스의 우선순위를 나타내는 nice 값의 범위와 가장 높은 우선순위에 해당하는 값으로 알맞은 것은?
A 0에서 19까지이며 0이 가장 높다 B -19에서 20까지이며 20이 가장 높다 C -20에서 19까지이며 -20이 가장 높다 D -20에서 19까지이며 19가 가장 높다 다음 중 프로세스의 상태를 실시간으로 갱신하며 보여 주는 명령으로 알맞은 것은?
다음 중 지정한 시각에 명령을 한 번만 실행하도록 예약하는 명령으로 알맞은 것은?