Python pty 모듈로 대화형 CLI 자동화하기
subprocess로 ssh에 비밀번호를 흘려넣으면 실패한다. 프로그램이 stdin이 아니라 제어 터미널에서 비밀번호를 읽기 때문이다. 같은 이유로 파이프에 물린 자식은 출력 버퍼링이 달라져 진행 상황이 실시간으로 안 보이고, bash -i는 프롬프트조차 띄우지…
subprocess로 ssh에 비밀번호를 흘려넣으면 실패한다. 프로그램이 stdin이 아니라 제어 터미널에서 비밀번호를 읽기 때문이다. 같은 이유로 파이프에 물린 자식은 출력 버퍼링이 달라져 진행 상황이 실시간으로 안 보이고, bash -i는 프롬프트조차 띄우지…
권한이 있는 프로세스만 열 수 있는 파일이나 소켓을, 정작 일은 권한 없는 프로세스가 처리해야 하는 구조가 종종 필요하다. 경로만 넘겨주고 상대가 다시 open()하게 하면 권한이 없어 실패하거나, 그 사이 파일이…
로그 압축, 이미지 변환, 체크섬 검증처럼 파일 수백 개를 도는 배치 스크립트를 for 루프로 짜면 코어가 6개든 32개든 하나만 쓴다. &로 전부 백그라운드에 던지면 이번엔 수백 개 프로세스가 한꺼번에 떠…
인터페이스가 언제 올라오고 IP가 언제 바뀌는지 감시해야 할 때, 흔히 ip monitor를 subprocess로 띄우고 출력을 파싱한다. 텍스트 포맷이 배포판마다 조금씩 달라 깨지기 쉽고, 1초마다 ip addr를 폴링하는 방식은 그 사이에…
파일을 복사할 때 흔히 쓰는 open() + read()/write() 루프는 데이터가 커널 버퍼 → 유저스페이스 버퍼 → 커널 버퍼로 두 번 오간다. os.copy_file_range()(Linux 4.5+, Python 3.8+)는 파일 디스크립터 두 개를 넘기면…
멀티코어 시스템에서 프로세스는 기본적으로 아무 CPU에서나 스케줄된다. 대부분은 이게 맞는데, 벤치마크 노이즈를 줄이거나, 특정 워커를 특정 코어에 묶어 캐시 지역성을 살리거나, 컨테이너에서 CPU 예산을 나눠 쓰는 경우엔 프로세스가 실제로 어느…
여러 프로세스가 같은 파일을 동시에 읽고 쓰면 레이스 컨디션이 생긴다. "파일에서 값을 읽고, 계산하고, 다시 쓴다"는 흔한 패턴도 두 프로세스가 동시에 끼어들면 한쪽의 갱신이 그냥 사라질 수 있다. Python의 fcntl…
프로세스 간에 잠깐 쓰고 버릴 데이터를 주고받을 때 /tmp에 실제 파일을 만들면 디스크(또는 tmpfs) 경로가 남고, 정리를 깜빡하면 흔적이 계속 쌓인다. memfd_create()는 파일시스템 어디에도 나타나지 않는 익명 메모리 파일을 만들어…
처음 터미널 창을 마주하면 깜빡이는 커서 앞에서 뭘 입력해야 할지부터 막막하다. 온라인 가이드마다 "터미널을 열고 이 명령을 입력하세요"라고 나오는데, 정작 경로가 뭔지, 파이프(|)가 뭔지, sudo를 왜 조심해야 하는지는 설명 없이…
파일 디스크립터를 안 닫는 코드 한 줄, 무한 재귀로 메모리를 다 먹는 버그 하나가 서버 프로세스 전체를 멎게 만드는 경우가 있다. 셸의 ulimit 대신, 파이썬 프로세스 내부에서 동적으로 조회하거나 특정…