제미나이 CLI 대신 agy 반복 실행: 대기열과 종료 판정 기준

제미나이 CLI에서 Antigravity CLI(agy)로 옮긴 뒤 스크립트로 원고를 반복 생성한다면, 본문 출력과 프로세스 종료를 따로 판정해야 한다. 한 번에 한 요청만 직렬로 돌리고 부모 프로세스에서 외부 시간 제한을 거는 조건에서 세운 기준이다. 근거는 2026-10-16 운영 기록과 2026-11-03 로컬 agy 1.4.12 실측이다.

agy 1.3.6에서 겪은 출력 후 미종료는 이 환경의 과거 운영 기록이고 1.4.12 실측 3건은 스스로 종료했으므로, 버전을 가정하지 말고 외부 제한과 출력 검수를 함께 둔다.

제미나이 CLI 다음, agy 반복 실행이 막히는 지점

Gemini CLI와 agy는 다른 도구다. 명령어와 JSON 규격, 설정 경로를 섞으면 안 된다.

Google 개발자 블로그 공지(2026-05-19 발표)는 2026년 6월 18일부터 Gemini CLI가 요청 처리를 멈춘다고 알렸다. 대상은 Google AI Pro·Ultra와 Gemini Code Assist for individuals 무료 이용자이며, 모든 이용자가 아니다.

터미널에서 한 번 응답을 받는 것과 스크립트가 요청을 차례로 처리하는 것은 조건이 다르다. 스크립트는 화면을 보는 사람 없이 종료 코드와 표준 출력만으로 다음 단계를 정한다.

2026-10-16 운영 메모에는 agy 1.3.6에서 본문이 다 나온 뒤에도 프로세스가 끝나지 않은 일이 적혀 있다. 여러 요청을 동시에 띄웠을 때 출력 없이 멈춘 일도 함께 기록돼 있다.

그래서 첫 호출에 성공했다면 다음에 세울 것은 호출 명령보다 실행 대기열과 종료 판정 규칙이다.

문서와 도움말, 그리고 1.4.12 실측

Antigravity CLI 공식 헤드리스 문서(2026-11-03 확인)에 따르면 -p 또는 --print는 요청 하나를 실행하고 끝낸다. 응답은 stdout으로, 오류·인증 안내·진행 상태는 stderr로 나간다.

같은 문서는 --print-timeout 기본값을 5m으로 적는다. 그런데 로컬 agy 1.4.12의 --help는 기본값을 0s로 표기하고, 0이면 턴이 끝날 때까지 기다린다고 안내한다. 기본값에 기대지 말고 마감 시간을 직접 정해야 하는 이유다.

Gemini CLI 공식 헤드리스 문서(2026-11-03 확인)도 JSON 출력을 다룬다. 다만 그 stats 구조는 agy JSON의 usage, status와 다르다. 두 도구의 파서를 섞어 쓰면 안 된다.

2026-11-03 darwin arm64에서 잠금 파일을 유지하고 stdin을 /dev/null로 닫은 채 agy 1.4.12를 직접 실행해 봤다.

/opt/homebrew/bin/agy -p "한 문장으로 자기소개" --output-format text --model gemini-4-argon-medium

과거 신뢰 폴더로 쓰던 경로와 새로 만든 폴더에서 한 번씩 돌렸다. 두 번 모두 stderr 없이 stdout에 자기소개가 나왔고, 11.941초와 12.906초에 스스로 종료 코드 0을 반환했다. 외부 제한(600초, 60초)에는 닿지 않았다.

같은 날 22,753자 원고 지시문 1건도 같은 모델로 단독 실행했다. 480초 외부 제한 전인 51.0초에 스스로 끝났고, stdout에 7,751자 본문이 남았다.

구분2026-10-16 (메모 기준 1.3.6)2026-10-27 (1.4.7)2026-11-03 (1.4.12)
실행 조건모델 비교 5건, 별도 정지 기록 10건단일 호출, 경쟁 agy 없음잠금 유지, stdin 닫음, 직렬 호출
출력 시점34.6~444.4초에 본문 기록기록 없음짧은 요청 첫 관측 10.516~11.726초
종료 상태5건 모두 480초 외부 제한으로 강제 종료, rc: nullexit 0짧은 요청 11.941~12.906초에 exit 0, 장문은 51.0초에 스스로 종료
확인 한계기록에 버전·병렬도 필드 없음미종료 수정의 공식 근거 아님3건 관측, 연속 실행 내구성 미검증

표에서 보듯 종료 양상은 시점과 버전에 따라 달랐다. 자기 환경의 버전과 도움말부터 확인해야 한다.

출력이 끝나도 종료와 실패를 따로 봐야 하는 이유

stdout에 글자가 찍힌 시점과 프로세스가 종료 코드를 돌려주는 시점은 같지 않을 수 있다.

2026-10-16 실행 기록에서 gemini-4-argon-medium 실행은 34.6초에 3,610자 본문 기록을 마쳤다. 그런데 프로세스는 끝나지 않았고 480.0초에 외부 제한으로 강제 종료됐다. 다른 두 모델을 포함한 5건이 모두 같은 결과였다.

별도 기록 파일 2개의 10건은 900.0초 동안 출력 0자인 채로 타임아웃됐다. 메모는 이를 동시 실행 중 정지로 설명하지만, 기록에 병렬도 필드가 없어 내부 원인은 확인하지 못했다.

종료 코드 0도 충분하지 않다. 공식 헤드리스 문서는 승인받지 못한 도구 호출을 거부(soft-deny)하고 실행을 이어가 0으로 끝낼 수 있다고 설명한다. 반대로 --help 실측에서는 stdout이 비고 도움말 전문이 stderr로만 나왔다.

결국 종료 코드, 출력 파일 크기, 끝 표지, stderr 내용을 함께 읽어야 한다.

스크립트에서 agy를 직렬로 돌리는 절차

여러 원고를 차례로 만든다면 공통 잠금과 부모 타이머를 갖춘 직렬 래퍼를 둔다. 동시에 띄웠을 때 출력 없이 멈췄다는 운영 메모가 있고, 타임아웃 기본값도 문서와 도움말이 다르기 때문이다.

2026-11-03 실험은 Perl alarm으로 외부 제한을 걸고 자식을 별도 프로세스 그룹으로 띄웠다. 실행 전 pgrep으로 다른 agy를 확인하고, 잠금 파일로 한 번에 하나만 돌렸다.

agy 원고 요청을 네 단계로 나눈 그림: 한 번에 하나만 실행하는 대기열, stdout에 원고가 생기는 출력(10/16 기록 34.6초), 1.3.6에서는 끝나지 않아 480초에 강제 종료됐고 1.4.12에서는 스스로 종료된 종료 단계, 종료 코드 0이어도 사실과 숫자를 따로 검사하는 검수 단계.

잠금으로 동시 실행을 막고, 부모 타이머 아래에서 출력을 나눠 저장한 뒤, 종료 코드와 본문을 검수하고 나서 잠금을 푼다.

  1. 실행 전 공통 잠금 파일(예: <폴더>/agy-lane.lock)과 실행 중인 agy 프로세스를 확인한다. 다른 세션과 겹치지 않게 한 번에 하나만 대기열에 넣는다.
  2. agy --version과 agy models로 버전과 모델 슬러그를 확인하고, 작업 폴더(cwd)와 함께 실행 로그에 남긴다. 2026-11-03 이 환경의 모델 목록은 13행이었다.
  3. stdin은 /dev/null로 닫는다. 내부 타임아웃 기본값에 기대지 말고 부모 프로세스에서 프로세스 그룹 단위로 외부 제한을 건다.
  4. stdout과 stderr를 별도 파일로 저장한다. 원고만 필요하면 --output-format text를, status와 usage를 기계로 읽을 계획이면 json을 후보로 둔다.
  5. 종료 코드 0과 별개로, 원고에 지정한 끝 표지(예: BODY_END)가 있는지와 사실·숫자 검사를 통과했는지 확인한 뒤에만 발행으로 넘긴다.

이렇게 두면 타임아웃으로 끊긴 경우에도 이미 쓰인 초안을 버리지 않고 미검수 상태로 보존할 수 있다.

이번 실측으로 확인하지 못한 것

2026-11-03 측정은 모든 환경과 장기 실행의 정상 종료를 보장하지 않는다. 1.3.6의 미종료가 어느 버전에서 바뀌었는지 릴리스 노트로 특정하지 못했고, 1.4.12 실험도 짧은 요청 2건과 장문 1건이 전부다.

새 폴더 실험에서는 신뢰 확인 질문이 뜨지 않았다. Antigravity 시작 문서(2026-11-03 확인)는 대화형 구성에서 작업 폴더 신뢰를 확인한다고 설명한다. 질문이 없던 이유가 상위 경로의 신뢰 상속인지, 비대화형 판정 조건인지는 확정하지 못했다.

Gemini CLI 설정 파일인 ~/.gemini/settings.json의 해시가 전후 같다는 것만 확인했다. 인증 만료, 할당량 초과, --print-timeout 도달 시 종료 코드, agy JSON 실출력은 직접 확인하지 않았다.

그래서 새 서버나 새 계정에서는 정기 배치에 바로 넣지 않는다. 쓸 작업 폴더에서 짧은 요청 1건을 먼저 돌려 stderr에 신뢰 질문이나 인증 안내가 찍히는지 확인한다.

agy 1.2.16 설치와 OAuth 인증, 첫 출력까지는 Gemini CLI 로그인이 막혔다, 결국 agy로 넘어간 이유에 정리했다.

결론

agy로 원고를 반복 생성할 때는 단일 잠금으로 동시 호출을 막고, 본문 생성과 프로세스 종료를 따로 기록해야 한다. 기준은 프로세스가 빨리 끝났는지가 아니라, 외부 제한 안에서 분리 저장한 stdout에 끝 표지까지 온전한 원고가 남았는지다. 지금 스크립트를 짜고 있다면 agy --version과 모델 이름을 로그에 남기고, stdin을 닫은 직렬 래퍼에서 짧은 요청 1건의 stdout, stderr, 종료 코드를 각각 파일로 저장하는 것부터 하면 된다.

댓글

이 블로그의 인기 게시물

AI 코딩 스킬, 많을수록 좋을까 — 자산이 부채로 바뀌는 손익분기

M4 Max 128GB 로컬 LLM 4종 속도 비교 — 실측 기록과 한계

Opus 5는 더 잘 쓰고, 더 AI답게 쓴다 — 세 모델 첫날 실측