실행중인 프로그램
리눅스는 기본적으로 다중 프로세스 시스템이기 때문에 동시에 여러 개의 프로세스를 실행할 수 있다
🔸 프로세스는 부모 - 자식 관계
모든 프로세스는 부모 - 자식 관계를 가진다
리눅스에서 부팅할 때 스케줄러가 실행한 프로세스인 systemd 와 kthreadd 프로세스를 제외하면 모든 프로세스는 부모 프로세스를 가지고 있다
자식 프로세스는 자신의 작업이 종료되면 결과를 부모 프로세스에게 반환하고 소멸됨
🔸 PID
각 프로세스는 고유한 번호를 가지게 되는데 이를 PID 라고 한다
1번 부터 시작하고 프로세스가 실행되면서 하나씩 증가하여 부여된다
systemd 프로세스 : 모든 시스템 프로세스의 부모 프로세스
kthreadd 프로세스: 모든 스레드의 부모 프로세스
유닉스에서는 1번 프로세스의 이름이 init 이었는데 리눅스에서는 systemd로 변경되었고, 호환성 문제 때문에 init을 systemd의 심볼릭 링크로 만들었다
ls -l /sbin/init

bin 디렉토리 - 명령어가 있는 디렉토리,
sbin 디렉토리 - 심볼릭링크 있는 디렉토리 - 호환하기 위해
특정 서비스를 제공하기 위해 존재하는 프로세스로 리눅스 커널에서 실행
평소에는 대기 상태로 있다가 서비스 요청이 오면 서비스를 제공
자식 프로세스가 아직 실행 중인데 부모 프로세스가 종료된 경우
고아 프로세스는 1번 프로세스가 부모 프로세스가 되도록해서 종료 할 수 있게 해야 한다
자식 프로세스는 자신의 작업이 종료되면 종료 정보를 부모 프로세스에게 보내고 부모 프로세스는 프로세스 테이블 목록에서 자식 프로세스를 제거해야 하는데 프로세스 테이블 목록에 남아있는 경우
이 경우 테이블 목록에 defunct 프로세스라고 나오기도 한다
kill 명령으로 삭제할 수 없으므로 SIGCHLD 시그널을 부모 프로세스에게 보내서 정리하도록 해야 한다
기본 형식 : ps [옵션]
옵션
-e : 시스템에서 실행 중인 모든 프로세스 확인
-f : 자세한 정보 출력
-u uid : 특정 사용자에 대한 프로세스 정보
-p pid : 특정 프로세스에 대한 정보
BSD 옵션으로 -를 붙이지 않음
a : 터미널에서 실행시킨 프로세스 정보
u : 상세 정보 출력
x : 실행중인 모든 프로세스
GNU 옵션으로 --로 시작
--pid PID목록 : 목록으로 지정한 프로세스 정보 확인 ps a 명령

R : 실행중
S : 인터럽트가 가능한 대기 상태
T : 작업 제어에 의한 정지된 상태
Z : 좀비 프로세스
s : 세션 리더 프로세스
+ : 포그라운드 프로세스 그룹
l : 멀티스레드
ps au 명령

USER : 유저
%CPU : CPU 사용량
%MEM : 메모리 사용량
VSZ : 가상 메모리
RSS : 물리적 메모리
ps -ef 명령
[ ] 가 있는 것은 스레드이다ps ax 나 ps auxps ax | more : 페이지 단위 출력ps -u 아이디

리눅스 명령 -> 웹사이트 처럼 gui 로 바꿔주는것 전부 리눅스 명령어로 하는 것임
ps -fu 아이디 나 ps -f -u 아이디 : 더 자세히 확인
u UID 이런식으로 인자를 받는 옵션인 경우는 옵션의 순서가 상관이 있다

ps 명령과 grep 명령을 이용하면 필요한 정보를 빠르게 검색 가능ps -ef|grep bash

pgrep [옵션] [패턴]
x : 패턴과 정확하게 일치하는 프로세스 정보 출력n : 패턴을 포함하고 있는 가장 최근 프로세스 정보 출력u 사용자이름 : 특정 사용자에 대한 모든 프로세스 정보 l : PID와 프로세스 이름을 출력t term : 특정 단말기와 관련된 프로세스의 정보를 출력pgrep -x bash

PID가 1279인 프로세스 정보 출력
ps -fp $(pgrep -x bash)

ps -fp $(pgrep -u jiwoni bash)

kill 이나 pkill
kill -l| 시그널 | 번호 | 기본 처리 | 의미 |
|---|---|---|---|
| SIGHUP | 1 | 종료 | 터미널과 연결이 끊겼을 때 발생 |
| SIGINT | 2 | 종료 | 인터럽트로 사용자가 ctrl + c 입력 시 발생 |
| SIGQUIT | 3 | 종료, 코어덤프 | 종료 신호로 사용자가 ctrl + \ 입력 시 발생 |
| SIGKILL | 9 | 종료 | 이 시그널을 받은 프로세스는 무시할 수 없으며 강제 종료 |
| SIGALRM | 14 | 종료 | 알람에 의해 발생 |
| SIGTERM | 15 | 종료 | kill 명령이 보내는 기본 시그널 |
kill 명령
kill [-시그널] PIDkill 명령 실습터미널에서 man ps 명령 수행
-> 수행되는 중
다른 터미널에서 ps -fp $(pgrep -x man) 으로 PID 확인

다른 터미널에서 kill PID
-> man ps 프로세스가 종료됨
pkill 명령
pkill 명령 실습여러 터미널에서 man ps 명령 수행
다른 터미널에서 ps -fp $(pgrep -x man) 수행
pkill man 으로 프로세스 종료

pgrep -x man 확인
-> 프로세스 종료된거 확인 - 아무것도 뜨지 않음
| 항목 | 의미 | 항목 | 의미 |
|---|---|---|---|
| PID | 프로세스 ID | SHR | 프로세스가 사용하는 공유 메모리의 크기 |
| USER | 사용자 계정 | %CPU | 퍼센트로 표시한 CPU 사용량 |
| PR | 우선순위 | %MEM | 퍼센트로 표시한 메모리 사용량 |
| NI | Nice 값 | TIME+ | CPU 누적 이용 시간 |
| VIRT | 프로세스가 사용하는 가상 메모리의 크기 | COMMAND | 명령 이름 |
| RES | 프로세스가 사용하는 메모리의 크기 |
| 내부명령 | 기능 |
|---|---|
Enter, Space Bar | 화면을 즉시 다시 출력한다 |
| h, ? | 도움말 화면을 출력 |
| k | 프로세스를 종료, 종료할 프로세스의 PID를 물어본다 |
| n | 출력하는 프로세스의 개수를 바꿈 |
| u | 사용자에 따라 정렬하여 출력 |
| M | 사용하는 메모리의 크기에 따라 정렬하여 출력 |
| p | cpu 사용량에 따라 정렬하여 출력 |
| q | top 명령 종료 |
사용자가 터미널에서 작업할 때 보통의 경우 한 번에 하나의 프로세스만 실행 가능
어떤 명령을 실행하면 명령이 끝날 때까지 기다려야 다시 터미널을 사용할 수 있음
어떤 프로세스를 실행하는 도중에 다른 프로세스를 실행해야 하는 경우가 발생할 수 있는데 작업 제어 도구는 이렇게 하나의 터미널에서 여러 프로세스를 실행하고 관리하기 위해 개발
사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다리는 방식으로 동작하는 프로세스
명령이 실행중에는 프롬프트가 보이지 않기 때문에 다른 명령을 수행시킬 수 없음
예: sleep 100 100초 동안 대기
백그라운드 방식으로 작업을 수행하면 명령의 처리가 끝나는 것과 상관없이 곧바로 프롬프트가 출력되어 사용자가 다른작업을 계속할 수 있음
수행시간이 오래걸리거나 다른 작업을 빠르게 출력하기 위해서 사용
명령을 백그라운드로 실행하려면 명령의 마지막에 & 기호를 추가
백그라운드로 작업을 실행하면 프롬프트가 바로 나옴
예 : sleep 100 &

백그라운드 작업에서 출력하는 부분이 있거나 오류가 발생할 때 주의해야한다.
포그라운드 작업과 출력이 겹칠 수도 있고 오류가 발생했을 때 오류 메시지를 정확하게 읽지 못할 수 있다
백그라운드 작업에서 출력을 해야 할 때는 파일에 출력하는 것이 좋다
# 파일에 출력
find / -name passwd > pw.data 2>&1 &
# 파일 확인
more pw.data
jobs [%작업번호]
%번호 : 작업 번호에 해당하는 작업을 조회
%+ 나 %% :작업 순서가 +인 작업 정보를 출력
%- : 작업 순서가 -인 작업 정보를 출력

| 항목 | 출력 예 | 의미 |
|---|---|---|
| 작업번호 | [1] | 작업 번호로 일련번호 형식 |
| 작업순서 | + | 작업순서를 표시+ : 가장 최근에 접근한 작업- : + 전에 접근한 작업 공백 : 그 이외의 작업 |
| 상태 | 실행 중 | 작업 상태를 표시실행중 : 현재 실행 중완료 : 작업이 정상적으로 종료종료됨 : 작업이 비정상적으로 종료멈춤 : 작업이 잠시 중단 |
| 명령 | 기능 |
|---|---|
ctrl + z | 현재 포그라운드 작업을 잠시 중단 |
bg %작업번호 | 작업번호가 지시하는 작업을 백그라운드 작업으로 전환 |
fg %작업번호 | 작업번호가 지시하는 작업을 포그라운드 작업으로 전환 |

ctrl + ckill PID 또는 kill %작업번호kill %작업번호nohup 명령 &sleep 1000 &
sleep 1000 &
jobs

kill %1
jobs

fg %2
^C

at [옵션] [시각]
옵션 :
l : 현재 실행 대기 중인 명령의 전체 목록을 출력
r 작업번호 : 현재 실행 대기 중인 명령 중 해당 작업 번호를 삭제
m : 출력 결과가 없더라도 작업이 완료되면 사용자에게 메일로 알려줌 (메일 서버 기능이 있어야 함)
f 파일 : 표준 입력 대신 실행할 명령을 파일로 지정
설치: sudo apt install at
시간 설정:
today , tomorrow , hours , days , weeks 가능at 4pm + 3days : 지금부터 3일 후 오후 4시에 작업을 수행at 10am Jul 31 : 7월 31일 오전 10시에 작업을 수행at 1am tomorrow : 내일 오전 1시에 작업을 수행at 10:00am today : 오늘 오전 10시에 작업을 수행at 명령 사용 후 종료는 ctrl + d
모든 명령은 절대 경로로 작성해야 한다
at 06:50 am
위 명령어를 입력하면 at 프롬프트로 들어감
/usr/bin/ls -l ~jiwoni > ~jiwoni/at.out
ctrl + d = <EOT> 
more/at.out
06:50에 파일 생성이 확인 가능하다
/var/spool/cron/atjobs 라는 디렉토리에 저장🔸 작업 파일 확인
sudo ls -l /var/spool/cron/atjobs 명령으로 확인하면 작업과 관련된 파일이 생성되는데 이 파일은 예약된 명령이 수행되면 삭제된다.🔸 예약한 작업 목록 보기
at -l
atq
🔸 예약된 작업 삭제
at -d 작업번호
atrm 작업번호

/etc/at.allow와 /etc/at.deny/etc/at.allow 파일에 작성하고 at 명령의 사용이 금지된 사용자들의 아이디를 /etc/at.deny 파일에 한줄에 하나씩 작성crontab [-u 사용자 ID][옵션][파일 경로]

요일 : 일요일이 0
각 항목은 공백으로 구분
항목의 값이 *이면 해당 항목의 모든 값을 의미
- 연산자를 이용하면 값의 범위를 지정할 수 있음.
ex : 요일 필드 1-5 설정 - 월요일부터 금요일까지
, 연산자를 이용하면 반복에 대한 값 목록을 정의할 수 있음
ex : 시간 필드 1,3,5 설정 - 1시 3시 5시
/연산자를 이용하면 단계값을 지정할 수 있음
ex : 분 필드 1-10/2 - 1,3,5,7,9 분에 수행(2분마다 수행)
ex : */20 - 20분마다 수행

-> 매월 1일 23시 30분에 지정한 작업을 수행
🔍 시간 설정 예시
45 22 * * * : 매일 22시 45분에 수행
0 17 * * 1 : 매주 월요일 17시에 수행
59 23 * * 1-5 : 월요일부터 금요일까지 23시 59분에 수행
*/10 * * * * : 10분 간격으로 수행
crontab -e

2. 10 * * * * /usr/bin/ls -l > ~jiwoni/linux_ex/cron.out 작성
3. 저장 : ctrl + o
4. 종료 : ctrl + x
5. 매일 10분에 명령 수행됨 (cat cron.out 으로 확인)

crontab -l

ls -l

crontab -r
*/5 * * * * date > ~jiwoni/linux_ex/crontab.out


crontab -r/etc/cron.allow 와 /etc/cron.deny 파일을 가지고 사용을 제한함