Python os.memfd_create()로 이름 없는 메모리 파일 다루기

프로세스 간에 잠깐 쓰고 버릴 데이터를 주고받을 때 /tmp에 실제 파일을 만들면 디스크(또는 tmpfs) 경로가 남고, 정리를 깜빡하면 흔적이 계속 쌓인다. memfd_create()는 파일시스템 어디에도 나타나지 않는 익명 메모리 파일을 만들어…

Continue ReadingPython os.memfd_create()로 이름 없는 메모리 파일 다루기

Ubuntu 커맨드라인 기초 명령어 정리

처음 터미널 창을 마주하면 깜빡이는 커서 앞에서 뭘 입력해야 할지부터 막막하다. 온라인 가이드마다 "터미널을 열고 이 명령을 입력하세요"라고 나오는데, 정작 경로가 뭔지, 파이프(|)가 뭔지, sudo를 왜 조심해야 하는지는 설명 없이…

Continue ReadingUbuntu 커맨드라인 기초 명령어 정리

Python resource 모듈로 프로세스 리소스 제한(RLIMIT) 다루기

파일 디스크립터를 안 닫는 코드 한 줄, 무한 재귀로 메모리를 다 먹는 버그 하나가 서버 프로세스 전체를 멎게 만드는 경우가 있다. 셸의 ulimit 대신, 파이썬 프로세스 내부에서 동적으로 조회하거나 특정…

Continue ReadingPython resource 모듈로 프로세스 리소스 제한(RLIMIT) 다루기

flock으로 Bash 스크립트 동시 실행 방지하기

cron 배치가 예상보다 오래 걸려 다음 스케줄과 겹치면, 두 인스턴스가 같은 파일에 동시에 써서 데이터가 꼬이는 사고가 난다. PID 파일로 막는 방식은 프로세스가 비정상 종료되면 파일만 남아 다음 실행을 영영…

Continue Readingflock으로 Bash 스크립트 동시 실행 방지하기

Python signal 모듈로 SIGTERM 핸들링과 graceful shutdown 구현하기

systemd나 Docker, Kubernetes는 프로세스를 종료할 때 먼저 SIGTERM을 보내고, 일정 시간(기본 10초 안팎) 안에 종료하지 않으면 SIGKILL로 강제 종료한다. 이 시간 안에 진행 중인 요청을 마무리하거나 파일 핸들을 정리하지 못하면…

Continue ReadingPython signal 모듈로 SIGTERM 핸들링과 graceful shutdown 구현하기

set -euo pipefail로 안전한 Bash 스크립트 작성하기

Bash 기본 동작은 명령 하나가 실패해도 스크립트가 멈추지 않고 다음 줄로 넘어간다. mkdir가 실패했는데 그다음 cd와 rm -rf *가 엉뚱한 디렉터리에서 실행되는 식의 사고가 여기서 나온다. set -euo pipefail은 이…

Continue Readingset -euo pipefail로 안전한 Bash 스크립트 작성하기

Bash 배열과 getopts로 커맨드라인 인자 제대로 다루기

쉘 스크립트에서 $1, $2를 순서대로 읽는 방식은 옵션이 두세 개만 넘어가도 순서를 착각하기 쉽고, 필수 옵션 누락 같은 실수를 걸러낼 방법이 없다. 공백으로 이어붙인 문자열을 IFS로 잘라 쓰는 방식도 값…

Continue ReadingBash 배열과 getopts로 커맨드라인 인자 제대로 다루기

Python mmap으로 파일을 메모리처럼 다루기

파일 크기가 물리 메모리를 넘어서면 open().read()로 통째로 읽는 순간 프로세스 메모리가 그만큼 늘어나 OOM killer에 걸릴 수 있다. Python 표준 라이브러리 mmap은 파일을 프로세스의 가상 주소 공간에 매핑해서, 실제로 접근한…

Continue ReadingPython mmap으로 파일을 메모리처럼 다루기

Bash trap과 시그널 처리로 안전한 스크립트 작성하기

배포 스크립트가 Ctrl+C나 SIGTERM으로 중간에 끊기면 임시 파일이 /tmp에 남고, lock 파일이 안 지워져 다음 실행이 죽고, 쓰다 만 결과 파일이 완료된 것처럼 남기도 한다. Bash의 trap은 시그널을 받거나 종료될…

Continue ReadingBash trap과 시그널 처리로 안전한 스크립트 작성하기

Python multiprocessing.shared_memory로 프로세스 간 메모리 공유하기

numpy 배열을 multiprocessing.Queue/Pipe로 주고받으면 매번 pickle 직렬화·역직렬화가 일어나 배열이 클수록 병목이 된다. Python 3.8부터 표준 라이브러리에 들어온 multiprocessing.shared_memory는 pickle 없이 OS의 진짜 공유 메모리(POSIX /dev/shm)를 이름으로 attach해 여러 프로세스가 같은…

Continue ReadingPython multiprocessing.shared_memory로 프로세스 간 메모리 공유하기