운영체제

[전공 기말고사 정리] 리눅스 운영체제 – 파일 디스크립터·리다이렉션·프로세스 관리·systemd·cron/at

gamjadori 2026. 7. 30. 15:21
728x90

════════════════════
1. 파일 디스크립터(FD)
════════════════════
• 프로세스가 파일이나 입출력장치와 통신할때 쓰는 정수번호표. 리눅스는 키보드·모니터·소켓까지 모두 파일로 취급, 3개 기본번호 자동부여
• 0 stdin(표준입력): 키보드→프로그램에 데이터 넣어줌
• 1 stdout(표준출력): 터미널화면에 정상결과 출력
• 2 stderr(표준오류): 터미널화면에 에러메시지 출력
• 역할: 컴퓨터시스템 보호, 개발편문화, 자원의 동기화, 리다이렉션과 파이프로 유연한 입출력전환
• FD는 파일 통로번호. 프로세스는 항상 이 세 통로(0/1/2) 가지고 태어남. 리다이렉션·파이프는 이 통로 방향(연결대상)만 바꾸는것
• Descriptor table(프로세스별) → Open file table(모든프로세스 공유) → inode table(모든프로세스 공유) 구조

════════════════════
02. 리다이렉션 & 파이프 & 필터
════════════════════

• 리다이렉션: 입출력방향을 화면/키보드 대신 파일로 변경
• 파이프(|): 앞명령의 출력을 다음명령의 입력으로 연결
• : 출력→파일(덮어쓰기), 파일없으면 새로생성 있으면 내용삭제후 저장, 예)ls > list.txt
• : 출력→파일(추가), 기존파일 끝에 이어붙임, 예)date >> log.txt
• <: 파일→입력, 파일내용을 프로그램 입력으로 사용, 예)sort < names.txt
• 2>: 에러→파일, 예)ls /x 2> err.txt
• 2>&1: 에러→출력과 합침, 예)cmd > f.txt 2>&1
• |: 파이프, 명령어 연결 데이터통로, 예)ls -l | grep txt
• 파이프흐름 예: ps -ef | grep bash | wc -l (전체프로세스목록 | bash줄만필터 | 줄수세기 → 최종출력: bash 프로세스개수)
• TIP: 오류무시 패턴 cmd 2> /dev/null(에러를 쓰레기통으로 버림), 모든출력무시 cmd > /dev/null 2>&1(전송되는 데이터 삭제하는 파일)
• /dev/null vs comm: 파일내용 비교(comm은 정렬되어있어야함, -i 대소문자구분X, -w 공백무시)
• 필터명령어
grep: 특정문자열 포함된줄 출력
sort: 줄단위로 정렬
uniq: 중복된 줄 제거(왼쪽만/오른쪽만 있는데용 등)
wc: 줄수/단어수/문자수 셈
head/tail: 결과 앞/뒤 몇줄
awk: 열단위로 텍스트처리
sed: 특정문자열 찾아 바꾸기

════════════════════
03. 프로세스 개념
════════════════════

• 프로세스(Process): 현재 메모리에 올라가서 실행중인 프로그램. 같은 프로그램 두번실행하면 프로세스 두개생김, 각각 고유PID 부여
• 부모-자식 계층구조(pstree): systemd(PID1,사용자공간조상) / kthreadd(PID2,커널공간조상) → 가장먼저 시작되는 조상프로세스
부모를 kill하면 자식도 함께종료 / PPID=부모프로세스번호
• 종류
포그라운드: 화면에서 사용자와 상호작용, 실행중 터미널점유(끝날때까지 기다려야함)
백그라운드: 화면뒤 조용히 실행, & 붙여실행, 터미널 자유롭게 사용가능
데몬(Daemon): 시스템서비스 제공하는 백그라운드프로세스, 시간이 오래걸리는 작업(터미널과 연결X), 이름끝에 d붙음(sshd,httpd,mysqld등)
좀비(Zombie): 자식은 종료됐지만 부모가 회수안한상태, PID고갈유발→주의필요, STAT열에 Z표시
고아(Orphan): 부모가 먼저종료된 자식프로세스, systemd(PID1)가 자동입양

════════════════════
04. 프로세스 관리명령어
════════════════════

• ps: 명령 실행순간의 프로세스 스냅샷(정적)
ps(내터미널것만) / ps -ef(시스템전체,유닉스스타일) / ps aux(CPU/메모리포함,BSD스타일) / ps -u root(특정사용자만)
컬럼의미: UID(사용자ID) PID(프로세스번호) PPID(부모번호) C(CPU%) STAT(R실행중S대기Z좀비T정지) STIME(시작시각) TTY(연결터미널종류) TIME(CPU누적시간) CMD(명령어) %MEM(메모리사용률)
ps a: 프로세스 정보출력(전체), TTY(Teletypewriter): 프로세스가 어떤 터미널창과 연결되어있는지 표시 - tty2(가상콘솔,물리모니터) / pts/0(SSH접속이나 GUI환경의 가상터미널)
• top: 실시간 리소스 모니터, 3초(기본값)마다 CPU·메모리 점유율 갱신, htop은 시각적효과 강화(별도설치필요)
전체태스크수/CPU·메모리 실시간확인, 개별행 PID·USER·%CPU·%MEM·COMMAND 표시
종료: q키 / 프로세스 직접kill: k입력후 PID입력
• kill/pkill/pgrep - 프로세스 종료 및 검색
kill PID: TERM(15)신호전송, 정상종료요청(프로세스가 거부가능)
kill -9 PID: SIGKILL, 강제즉시종료(거부불가,마지막수단)
kill -1 PID: SIGHUP, 설정파일 재로드(서비스중단없음, 데몬관리용)
kill -9 P1 P2: 여러PID 한번에 강제종료
pkill -9 chrome: 이름으로 찾아종료(PID몰라도됨)
pgrep -l bash: 이름으로 PID검색, PID·이름 함께출력
pgrep -a gdm: 전체경로/옵션까지 출력
pgrep: 지정한 패턴과 일치하는 프로세스정보 출력
주의: kill -9는 정리기회 안줌. kill(기본)→kill -15→kill -9 순으로 시도

════════════════════
05. 작업제어(Job Control)
════════════════════

• 셸안에서 실행중인 명령들을 작업(Job)이라함. 포그라운드↔백그라운드 전환, 일시중지/재개/종료 제어
• 명령어&: 처음부터 백그라운드 실행, 예)sleep 100 &
• Ctrl+Z: 실행중인 포그라운드작업을 일시중지(Stopped)로 전환(종료아니고 잠시중단)
• jobs: 현재셸의 백그라운드/중지작업 목록
• bg %1: 1번작업을 백그라운드로 재개(%없이 bg 1도 가능)
• fg %1: 1번작업을 포그라운드로 가져옴
• kill %1: 1번작업 종료(PID대신 작업번호로)
• TIP: jobs출력의 [1]+ Running sleep 100 & 에서 [1]=작업번호, +=가장최근작업, Running=상태

════════════════════
06. systemd & systemctl
════════════════════

• systemd는 부팅시 가장먼저 실행되는 PID1 프로세스(최상위,동시에 병렬실행가능). 모든서비스(유닛)의 시작/중지/로그 통합관리, 병렬부팅으로 빠른시작
• 부팅단계: BIOS/UEFI → GRUB → 커널로드 → systemd(PID1) → sysinit.target → basic.target → multi-user.target → graphical.target (유닛단위 관리)
• 서비스: 운영체제에서 특정기능을 제공하기위해 백그라운드에서 실행되는 지속적인 프로세스/데몬
• 유닛종류: .service(백그라운드서비스/데몬실행,sshd·nginx·mysqld) / .timer(일정주기 실행,cron대체가능) / .socket(네트워크소켓기반 활성화) / .mount(파일시스템마운트관리) / .target(여러유닛 묶는그룹,옛runlevel대체)
• 명령어: systemctl status(현재상태+최근로그) / start / stop / restart(중지후재시작,설정변경적용시) / reload(설정파일만 다시읽기,서비스중단없음) / enable(부팅시자동시작,심볼릭링크생성-활성화만되고 시작상태는X, enable하고 start해야함) / disable(자동시작해제) / list-unit-files(모든유닛목록) / daemon-reload(유닛파일변경후 즉시반영)
• STATE: enabled(부팅시자동시작,심볼릭링크존재) / disabled(수동시작만) / masked(완전비활성화,/dev/null링크) / static(시스템필수유닛,enable/disable불필요)
• Cgroup: 프로세스 폭주방지를 위해 프로세스를 그룹으로 묶어 자원제한
/sys/fs/cgroup: 설치된 cgroup 목록 / /proc/pid/cgroup: 프로세스별 cgroup정보
• 바이너리 실행파일: 실행가능한 프로그램파일이 들어있는 디렉터리
/bin: 일반사용자 사용가능(ls,cp) / /sbin: root권한이 사용(mount,reboot)
/usr/local/bin: 사용자가 설치 / /usr/bin: 운영체제가 설치

════════════════════
07. 작업예약 관리(cron & at)
════════════════════

• cron: 반복실행 스케줄러 / at: 1회실행 스케줄러. crond/atd 데몬이 항상 백그라운드에서 대기하다 설정시간에 실행
• cron: 주기적반복작업(매일백업,로그정리), 설정 crontab -e, 실행후 계속남아 반복실행, 목록확인 crontab -l, 데몬 crond
• at: 미래특정시점 1회실행(배포후재시작), 설정 at[시간]→명령입력, 대기열에서 자동제거, 목록확인 atq, 데몬 atd
at은 따로설치필요: sudo apt install at -y
• crontab 형식: 분(0-59) 시(0-23) 일(1-31) 월(1-12) 요일(0-7,0=일) 명령어
특수문자: (와일드카드,해당필드모든값) ,(나열,여러값) -(범위,시작~끝연속) /(간격,step, 예/10=10분마다)
실전예시: 0 9 * * * → 매일오전9시정각 / */5 * * * * → 5분마다 / 0 9-18 * * 1-5 → 평일9~18시매시정각 / 30 2,14 * * * → 새벽2:30·오후2:30 / 0 0 1 1,7 * → 1월7월1일자정
단축표현: @reboot(부팅할때마다1회) @daily(매일자정) @weekly @monthly @yearly
cron 실행방법: crontab -e(사용자개인스케줄) / /etc/crontab(시스템전체스케줄)
• at명령어: at 14:30 / at 9am tomorrow / at now + 2 hours / at midnight / atq(대기목록) / atrm번호 / at -c번호
사용예시: $at now + 5 minutes → at> echo “restarted: $(date)” >> /tmp/log.txt → Ctrl+D로 입력완료(저장방법) → atq로 확인 → atrm 1로 취소
• TCP Wrapper: 특정 네트워크 접근차단·허용하는 보안기능
지원하는 서비스만 가능, 확인방법: ldd /usr/sbin/sshd | grep libwrap (공유라이브러리 확인명령어)
allow,deny파일관리(우선순위는 allow>deny) - /etc/hosts.allow, /etc/hosts.deny 파일로 관리(둘다없으면 기본적으로 허용상태)
문법: 서비스:클라이언트 예)sshd: 192.168.1.10 / ALL:ALL
crontab,at도가능 - cron.allow 파일을 관리자가 만들어야함 - /etc/cron.allow, /etc/cron.deny(이경우로 생성,기본적으로 생성) / /etc/at.allow, at.deny