Python pty 모듈로 대화형 CLI 자동화하기

subprocess로 ssh에 비밀번호를 흘려넣으면 실패한다. 프로그램이 stdin이 아니라 제어 터미널에서 비밀번호를 읽기 때문이다. 같은 이유로 파이프에 물린 자식은 출력 버퍼링이 달라져 진행 상황이 실시간으로 안 보이고, bash -i는 프롬프트조차 띄우지…

Continue ReadingPython pty 모듈로 대화형 CLI 자동화하기

Python socket.send_fds()로 프로세스 간 파일 디스크립터 전달하기

권한이 있는 프로세스만 열 수 있는 파일이나 소켓을, 정작 일은 권한 없는 프로세스가 처리해야 하는 구조가 종종 필요하다. 경로만 넘겨주고 상대가 다시 open()하게 하면 권한이 없어 실패하거나, 그 사이 파일이…

Continue ReadingPython socket.send_fds()로 프로세스 간 파일 디스크립터 전달하기

Bash 스크립트 병렬 처리 — xargs -P와 GNU parallel 실측 비교

로그 압축, 이미지 변환, 체크섬 검증처럼 파일 수백 개를 도는 배치 스크립트를 for 루프로 짜면 코어가 6개든 32개든 하나만 쓴다. &로 전부 백그라운드에 던지면 이번엔 수백 개 프로세스가 한꺼번에 떠…

Continue ReadingBash 스크립트 병렬 처리 — xargs -P와 GNU parallel 실측 비교

Python netlink 소켓으로 커널 이벤트 실시간 수신하기

인터페이스가 언제 올라오고 IP가 언제 바뀌는지 감시해야 할 때, 흔히 ip monitor를 subprocess로 띄우고 출력을 파싱한다. 텍스트 포맷이 배포판마다 조금씩 달라 깨지기 쉽고, 1초마다 ip addr를 폴링하는 방식은 그 사이에…

Continue ReadingPython netlink 소켓으로 커널 이벤트 실시간 수신하기

Python os.copy_file_range()로 커널 레벨 zero-copy 파일 복사하기

파일을 복사할 때 흔히 쓰는 open() + read()/write() 루프는 데이터가 커널 버퍼 → 유저스페이스 버퍼 → 커널 버퍼로 두 번 오간다. os.copy_file_range()(Linux 4.5+, Python 3.8+)는 파일 디스크립터 두 개를 넘기면…

Continue ReadingPython os.copy_file_range()로 커널 레벨 zero-copy 파일 복사하기

Python os.sched_setaffinity()로 CPU 친화도 제어하기

멀티코어 시스템에서 프로세스는 기본적으로 아무 CPU에서나 스케줄된다. 대부분은 이게 맞는데, 벤치마크 노이즈를 줄이거나, 특정 워커를 특정 코어에 묶어 캐시 지역성을 살리거나, 컨테이너에서 CPU 예산을 나눠 쓰는 경우엔 프로세스가 실제로 어느…

Continue ReadingPython os.sched_setaffinity()로 CPU 친화도 제어하기

Python fcntl로 파일 잠금(advisory lock)과 바이트 범위 잠금 다루기

여러 프로세스가 같은 파일을 동시에 읽고 쓰면 레이스 컨디션이 생긴다. "파일에서 값을 읽고, 계산하고, 다시 쓴다"는 흔한 패턴도 두 프로세스가 동시에 끼어들면 한쪽의 갱신이 그냥 사라질 수 있다. Python의 fcntl…

Continue ReadingPython fcntl로 파일 잠금(advisory lock)과 바이트 범위 잠금 다루기

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) 다루기