프로세스의 개념
프로세스는 현재 실행 중인 프로그램이다.
리눅스에는 시스템 프로세스와 사용자 프로세스가 있다.
프로세스는 부모-자식 관계를 가지고 있으며 PID라는 각기 고유한 번호가 있다.
프로세스의 종류
데몬 프로세스 : 리눅스 커널에 의해 실행되고 평소에는 대기 상태로 있다가 서비스 요청이 들어오면 서비스를 제공한다.
부모 프로세스 : 자식 프로세스를 만드는 프로세스이다.
자식 프로세스 : 부모 프로세스에 의해 만들어지는 프로세스이다.
고아 프로세스 : 결과를 돌려주기 전에 부모 프로세스가 먼저 종료된 자식 프로세스이다. 1번 프로세스가 새로운 부모 프로세스가 되어준다.
좀비 프로세스 : 사용 중인 모든 자원을 반납했지만 부모 프로세스로부터 작업 종료에 대한 승인을 받지 못한 상태의 프로세스이다. kill 명령으로 제거할 수 없고 SIGCHLD 시그널을 부모 프로세스에 보내어 부모 프로세스가 자식 프로세스를 정리하도록 하거나 부모 프로세스 자체를 종료시켜 1번 프로세스가 정리하도록 해야 한다.
프로세스의 관리 명령
<프로세스 목록 보기>
ps : 현재 실행 중인 프로세스의 정보를 출력한다. 우분투에서 ps 명령의 옵션은 아래 세 가지 유형을 모두 지원한다. grep 명령을 |(파이프)로 연결하여 특정 프로세스의 정보를 검색할 수 있다(ps -ef | grep 'process_name')
ps 명령의 옵션 | 의미 | 비고 |
-e | 시스템에서 실행 중인 모든 프로세스의 정보 출력 | 유닉스 옵션(옵션 앞에 '-'을 붙인다) |
-f | 프로세스의 자세한 정보 출력 | 유닉스 옵션 |
-u uid | 특정 프로세스에 대한 모든 프로세스의 정보 출력(-fu 옵션도 있음) | 유닉스 옵션 |
-p pid | pid로 지정한 특정 프로세스의 정보 출력(-fp 옵션도 있음) | 유닉스 옵션 |
a | 터미널에서 실행한 프로세스의 정보 출력(au, ax 옵션도 있음) | BSD 옵션(옵션 앞에 '-'을 붙이지 않는다) |
u | 상세 정보 출력(프로세스 소유자 이름, CPU 사용량, 메모리 사용량 등) | BSD 옵션 |
x | 시스템에서 실행 중인 모든 프로세스의 정보 출력 | BSD 옵션 |
-- pid PID | 목록으로 지정한 특정 PID의 정보 출력 | GNU 옵션(옵션 앞에 '--'을 붙인다) |
pgrep : 지정한 패턴과 일치하는 프로세스의 정보를 출력한다. 패턴과 일치하는 프로세스를 찾아 PID를 알려준다.
pgrep 명령의 옵션 | 의미 |
-x | 패턴과 정확히 일치하는 프로세스의 정보 출력 |
-n | 패턴을 포함하고 있는 가장 최근의 프로세스의 정보 출력 |
-u 사용자명 | 특정 사용자에 대한 모든 프로세스를 출력 |
-l | PID와 프로세스 이름 출력 |
-t term | 특정 단말기와 관련된 프로세스의 정보를 출력 |
더 자세한 정보를 검색하려면 pgrep 명령을 ps 명령과 연결해서 사용해야 한다. pgrep 명령으로 검색하려는 프로세스의 PID를 찾고 ps 명령으로 자세한 정보를 확인할 수 있다. ex) ps -fp $(pgrep -x bash)
<프로세스 종료하기>
시그널 : 프로세스에 무언가 발생했음을 알리는 간단한 메시지이다. 미리 정의된 상수 사용하며 kill -l 명령으로 확인할 수 있다. 주요 시그널은 아래와 같다.
시그널 | 번호 | 기본 처리 | 의미 |
SIGHUP | 1 | 종료 | 터미널과의 연결이 끊어졌을 때 발생 |
SIGINT | 2 | 종료 | 인터럽트로 사용자가 Ctrl+c를 입력하면 발생한다. |
SIGQUIT | 3 | 종료, 코어덤프 | 종료 신호로 사용자가 Ctrl+\를 입력하면 발생한다. |
SIGKILL | 9 | 종료 | 이 시그널을 받은 프로세스는 무시할 수 없으며 강제로 종료된다. |
SIGALRM | 14 | 종료 | 알람에 의해 발생한다. |
SIGTERM | 15 | 종료 | kill 명령이 보내는 기본 시그널이다. |
kill [-시그널] PID : 지정한 시그널을 프로세스에 전달한다.
pkill, killall : PID 대신 명령 이름으로 프로세스를 찾아 종료한다.
<프로세스 관리 도구>
시스템에서 실행중인 정보를 주기적으로 출력한다.
top 명령과 시스템 감시가 있다.
포그라운드와 백그라운드 작업
포그라운드 작업 : 사용자가 명령을 입력한 후 결과가 출력될 때까지 기다려야 하는 작업
백그라운드 작업 : 명령의 처리와 관계없이 곧바로 프롬프트를 사용 가능(여러 개의 작업 가능)
명령을 백그라운드로 실행하려명 명령의 마지막에 &(엠퍼샌드) 기호를 추가한다.
백그라운드의 작업의 실행이 끝나면 현재 터미널에서 무엇을 하고 있는지에 상관없이 결과가 화면에 출력된다.
즉, 기존의 작업 화면과 백그라운드 작업 결과가 뒤섞여 제대로 확인하기 어려워지는 문제가 있다.
그래서 백그라운드로 처리할 때는 출력과 오류 방향을 전환하여 실행 결과와 오류 메시지를 파일로 저장하는 방법을 많이 사용한다.
ex) find / -name passwd > pw.dat 2>&1 & # pw.dat에 결과와 오류를 저장한다.
<작업 관리 명령>
jobs : 백그라운드 작업 목록을 출력한다.
jobs 명령의 옵션 | 의미 |
%번호 | 해당 번호의 작업 정보를 출력 |
%+ / %% | 작업 순서가 +인 작업 정보를 출력 |
%- | 작업 순서가 -인 작업 정보를 출력 |
jpbs 명령의 출력 항목 | 출력 예 | 의미 |
작업 번호 | [1] | 작업 번호로서 백그라운드로 실행할 때마다 순차적으로 증가한다. |
작업 순서 | + | 작업 순서를 표시한다. + : 가장 최근에 접근한 작업 - : + 작업보다 바로 전에 접근한 작업 공백 : 그 외의 작업 |
상태 | 실행중 | 작업 상태를 표시한다. 실행중 : 작업이 현재 실행중 완료 : 작업이 정상적으로 종료됨 종료됨 : 작업이 비정상적으로 종료됨 정지됨 : 작업이 잠시 중단됨 |
명령 | sleep 100 & | 백그라운드로 실행 중인 명령이다. |
fg [%작업번호] : 해당 작업이나 현재 작업을 포그라운드 작업으로 전환한다.
bg [%작업번호] : 해당 작업이나 현재 작업을 백그라운드 작업으로 전환한다.
ctrl + z 또는 stop %작업번호 : 프로그라운드 작업을 잠시 중단한다.(종료 아님)
kill %작업번호 : 해당 작업을 종료한다. 포그라운드 작업은 대부분 Ctrl+c를 입력하면 종료되지만 백그라운드 작업은 kill 명령으로 강제 종료해야 한다.(kill 명령의 인자로 PID 대신 작업번호를 지정할 수 있음)
nohup 명령 & : 로그아웃한 후에도 백그라운드 작업을 계속 실행한다.
백그라운드 작업을 실행한 터미널이 종료되거나 사용자가 로그아웃하면 실행 중이던 백그라운드 작업도 함께 종료되는데, 이를 방지하기 위해 nohup을 사용한다.
자동 작업 관리
<정해진 시간에 한 번 실행하기>
at : 예약한 명령을 정해진 시간에 실행한다.
at -l, atq : 현재 사용자의 등록된 작업 목록을 보여준다.
at -d, atrm : 지정된 작업을 삭제한다.
at 명령의 사용이 허용된 사용자들은 /etc/at.allow 파일에 지정하고, 금지된 사용자들은 /etc/at.deny에 지정한다. 만약 두 파일 모두 없으면 root만 at 명령을 사용할 수 있다.
(적용 우선순위 : allow -> deny)
<정해진 시간에 반복 실행하기>
crontab : 사용자의 crontab 파일을 관리한다. crontab 파일은 분, 시, 일, 월, 요일(0:일~6:토), 작업 내용으로 구성된다.
(crontab 명령으로 관리하는 파일은 사용자별로 생성된다)
crontab -e : crontab 파일을 생성하고 편집한다.
crontab -l : crontab 파일의 내용을 출력한다.
crontab -r : crontab 파일을 삭제한다.
crontab 명령의 사용이 허용된 사용자들은 /etc/cron.allow 파일에 지정하고, 금지된 사용자들은 /etc/cron.deny에 지정한다. 만약 두 파일 모두 없으면 시스템 설정에 따라 시스템 관리자만 corntab 명령을 사용할 수도 있고 모든 사용자가 사용할 수도 있다.
(적용 우선순위 : allow -> deny)
'development > Linux' 카테고리의 다른 글
[우분투 리눅스] 리눅스의 부팅과 종료 (0) | 2022.07.31 |
---|---|
[우분투 리눅스] 파일 시스템과 디스크 관리 (0) | 2022.07.27 |
[우분투 리눅스] 파일 접근 권한 관리하기 (0) | 2022.07.20 |
[우분투 리눅스] 셸 기초 사용법 (0) | 2022.07.19 |
[우분투 리눅스] vi 기초 사용법 (0) | 2022.07.12 |