프로세스를 보고, 신호를 보내고, 셸의 백그라운드 작업을 다루는 명령이다.
ps
ps는 지금 프로세스의 스냅샷이다. 옵션 문법이 두 갈래다. 둘 다 GNU ps에서 쓸 수 있다.
ps aux
ps -ef
ps -u "$USER"
ps -p 1234 -o pid,ppid,stat,etime,cmd`aux`는 BSD 형식이다. 터미널이 없는 프로세스를 포함해 넓은 명령줄로 보여 준다. `-ef`는 POSIX 형식이다. `-e`는 전체, `-f`는 자세한 열이다.
`-o`는 보고 싶은 열만 고른다. pid는 프로세스 번호, ppid는 부모, etime은 지금까지 돈 시간, cmd는 명령줄이다.
STAT의 앞글자는 상태다. `R`은 실행 중이거나 곧 실행될 자리, `S`는 이벤트를 기다리는 잠, `D`는 디스크 같은 인터럽트할 수 없는 잠, `T`는 멈춘 상태, `Z`는 종료됐지만 부모가 아직 거두지 않은 좀비다. `+`가 붙으면 포그라운드 프로세스 그룹이다.
top
top은 같은 정보를 주기적으로 다시 그린다. 끝나는 키는 q다.
- `P`는 CPU를 많이 쓰는 순으로 정렬한다. - `M`은 메모리를 많이 쓰는 순이다. - `1`은 CPU를 하나씩 나눠 보여 준다. - `h`는 도움말이다.
htop이 설치되어 있으면 스크롤과 필터가 더 편하다. 보는 값은 같다.
신호
kill은 이름과 달리 항상 죽이는 명령이 아니다. 프로세스에 신호를 보낸다. 기본 신호는 TERM(15)이다. 프로세스가 파일을 닫고 끝날 기회를 준다.
kill 1234
kill -TERM 1234
kill -9 1234
kill -l`kill -l`은 신호 이름 목록이다. 9번은 KILL이다. 프로세스가 막을 수 없다. 기록이 중간에 끊길 수 있으므로, TERM으로 끝나지 않을 때 마지막에 쓴다.
이름으로 찾으려면 pgrep으로 먼저 대상을 확인하고, 맞을 때만 pkill을 쓴다.
pgrep -a nginx
pkill -TERM -x myworker`-a`는 번호와 명령줄을 같이 보여 준다. `-x`는 이름이 일부만 같은 프로세스가 아니라, 이름 전체가 같을 때만 고른다.
셸 작업
명령 끝에 `&`를 붙이면 셸은 그 명령을 백그라운드로 보내고 프롬프트를 바로 돌려준다.
sleep 100 &
jobs
fg %1
bg %1Ctrl-z는 앞의 작업을 멈춘다. `fg`는 그 작업을 다시 앞으로 가져온다. `bg`는 멈춘 작업을 뒤에서 재개한다. `%1`은 jobs에 나온 번호다.
Ctrl-c는 INT 신호다. 앞의 명령이 받는다.
터미널이 끊길 때 셸은 자식에게 SIGHUP을 보낸다. 접속이 끝나도 남기려면 nohup으로 출력을 파일에 남기고 뒤로 보낸다. 오래 돌릴 서비스는 systemd에 맡기는 편이 낫다. systemctl 글에 적어 두었다.
nohup ./job.sh > job.log 2>&1 &
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.