
Codex 사용량이 Plus 사용자에겐 좀 모자랄 때가 있습니다. Claude Code는 사용량이 리셋되면 알아서 재개를 해주는데 Codex는 아직 그런 기능이 없습니다.
Codex CLI에서 간단한 bash 프로그램으로 시간에 맞춰서 작업을 계속하게 할 수 있습니다. codex 실행과 함께 프롬프트를 주입하는 인터페이스가 있기 때문이죠.
실행하면 아래처럼 됩니다. (하이라이트한 부분이 사용자가 입력하는 부분입니다.)
$ codex-wakeup.sh
Codex 세션 ID: 01axxxxx-xxxx-xxxx-9786-c1e16cf601d6
재개 시각 (HH:MM, 예: 04:13): 01:42
프롬프트 입력 (빈 줄로 완료, 아무것도 입력하지 않으면 '계속해'):
계속 진행하자
세션: 01axxxxx-xxxx-xxxx-9786-c1e16cf601d6
재개: 2026-10-06 01:42:38
프롬프트:
계속 진행하자
대기: 80분
Codex 자동 재개를 기다립니다. Ctrl+C로 취소할 수 있습니다.
“계속 진행하자” 하고 프롬프트를 입력한 다음에 두 줄이 띄어져 있는데, 빈 줄에서 엔터를 한번 쳐 줘야 프롬프트 입력이 완료된다는 점에 주의하세요. 여러줄 프롬프트를 입력하기 위한 방법입니다.
제 경우 1시 40분에 리셋되는 건데, 1시 42분에 작업을 재개하는 프롬프트를 입력하도록 하고 자려고 하는 거죠. 맥과 리눅스 버전 스크립트를 첨부했습니다.
컴퓨터가 잠자기 모드로 들어가지 않도록 명령 안에 장치가 돼 있습니다.
코드는 ChatGPT 시켜서 짰습니다.
윈도우용은 권한 때문에 실행이 제대로 안 되면 아래 명령으로 실행해 보라고 합니다(ChatGPT 조언).
(아직 리눅스용과 윈도우용은 테스트해보지 못했습니다.)
powershell -ExecutionPolicy Bypass -File .\codex-wakeup.ps1
맥용
#!/bin/bash
# Codex 세션 자동 재개
# macOS용
read -r -p "Codex 세션 ID: " SESSION_ID
if [[ -z "$SESSION_ID" ]]; then
echo "세션 ID가 없습니다."
exit 1
fi
read -r -p "재개 시각 (HH:MM, 예: 04:13): " RESUME_TIME
if [[ ! "$RESUME_TIME" =~ ^([01][0-9]|2[0-3]):[0-5][0-9]$ ]]; then
echo "시각 형식이 잘못됐습니다. HH:MM 형식으로 입력하세요."
exit 1
fi
echo "프롬프트 입력 (빈 줄로 완료, 아무것도 입력하지 않으면 '계속해'):"
PROMPT=""
while IFS= read -r LINE; do
[[ -z "$LINE" ]] && break
if [[ -z "$PROMPT" ]]; then
PROMPT="$LINE"
else
PROMPT="${PROMPT}"$'\n'"${LINE}"
fi
done
PROMPT="${PROMPT:-계속해}"
TODAY=$(date "+%Y-%m-%d")
NOW=$(date "+%s")
TARGET=$(date -j -f "%Y-%m-%d %H:%M" \
"$TODAY $RESUME_TIME" "+%s")
# 입력한 시간이 이미 지났으면 다음 날로 설정
if (( TARGET <= NOW )); then
TOMORROW=$(date -j -v+1d "+%Y-%m-%d")
TARGET=$(date -j -f "%Y-%m-%d %H:%M" \
"$TOMORROW $RESUME_TIME" "+%s")
fi
WAIT=$(( TARGET - NOW ))
echo
echo "세션: $SESSION_ID"
echo "재개: $(date -r "$TARGET" "+%Y-%m-%d %H:%M:%S")"
echo "프롬프트:"
printf '%s\n' "$PROMPT"
echo "대기: $((WAIT / 60))분"
echo
echo "Codex 자동 재개를 기다립니다. Ctrl+C로 취소할 수 있습니다."
# 대기 중 macOS 시스템 sleep 방지
caffeinate -i sleep "$WAIT"
echo
echo "Codex를 재개합니다."
exec codex resume "$SESSION_ID" "$PROMPT"
리눅스용
#!/usr/bin/env bash
read -r -p "Codex 세션 ID: " SESSION_ID
[[ -z "$SESSION_ID" ]] && { echo "세션 ID가 없습니다."; exit 1; }
read -r -p "재개 시각 (HH:MM, 예: 04:13): " RESUME_TIME
[[ "$RESUME_TIME" =~ ^([01][0-9]|2[0-3]):[0-5][0-9]$ ]] || { echo "시각 형식이 잘못됐습니다."; exit 1; }
echo "프롬프트 입력 (빈 줄로 완료, 아무것도 입력하지 않으면 '계속해'):"
PROMPT=""
while IFS= read -r LINE; do
[[ -z "$LINE" ]] && break
[[ -z "$PROMPT" ]] && PROMPT="$LINE" || PROMPT+=$'\n'"$LINE"
done
PROMPT="${PROMPT:-계속해}"
NOW=$(date +%s)
TARGET=$(date -d "$(date +%Y-%m-%d) $RESUME_TIME" +%s 2>/dev/null) || {
echo "재개 시각을 계산하지 못했습니다."; exit 1;
}
(( TARGET <= NOW )) && TARGET=$(date -d "tomorrow $RESUME_TIME" +%s)
WAIT=$((TARGET - NOW))
echo
echo "세션: $SESSION_ID"
echo "재개: $(date -d "@$TARGET" "+%Y-%m-%d %H:%M:%S")"
echo "프롬프트:"
printf '%s\n' "$PROMPT"
echo "대기: $((WAIT / 60))분"
echo
echo "Codex 자동 재개를 기다립니다. Ctrl+C로 취소할 수 있습니다."
run_codex() {
sleep "$WAIT"
echo
echo "Codex를 재개합니다."
exec codex resume "$SESSION_ID" "$PROMPT"
}
if command -v systemd-inhibit >/dev/null 2>&1; then
export WAIT SESSION_ID PROMPT
exec systemd-inhibit --what=sleep --why="Waiting to resume Codex session" \
bash -c 'sleep "$WAIT"; echo; echo "Codex를 재개합니다."; exec codex resume "$SESSION_ID" "$PROMPT"'
else
run_codex
fi
윈도우용
# Codex 세션 자동 재개
# Windows PowerShell용
$SessionId = Read-Host "Codex 세션 ID"
if ([string]::IsNullOrWhiteSpace($SessionId)) {
Write-Host "세션 ID가 없습니다."
exit 1
}
$ResumeTime = Read-Host "재개 시각 (HH:mm, 예: 04:13)"
if ($ResumeTime -notmatch '^([01]\d|2[0-3]):[0-5]\d$') {
Write-Host "시각 형식이 잘못됐습니다. HH:mm 형식으로 입력하세요."
exit 1
}
Write-Host "프롬프트 입력 (빈 줄로 완료, 아무것도 입력하지 않으면 '계속해'):"
$Lines = @()
while ($true) {
$Line = Read-Host
if ([string]::IsNullOrEmpty($Line)) { break }
$Lines += $Line
}
$Prompt = if ($Lines.Count -eq 0) { "계속해" } else { $Lines -join "`n" }
$Hour, $Minute = $ResumeTime.Split(':')
$Now = Get-Date
$Target = Get-Date -Hour ([int]$Hour) -Minute ([int]$Minute) -Second 0
if ($Target -le $Now) {
$Target = $Target.AddDays(1)
}
$WaitSeconds = [math]::Ceiling(($Target - $Now).TotalSeconds)
Write-Host ""
Write-Host "세션: $SessionId"
Write-Host ("재개: {0:yyyy-MM-dd HH:mm:ss}" -f $Target)
Write-Host "프롬프트:"
Write-Host $Prompt
Write-Host ("대기: {0}분" -f [math]::Floor($WaitSeconds / 60))
Write-Host ""
Write-Host "Codex 자동 재개를 기다립니다. Ctrl+C로 취소할 수 있습니다."
# 대기 및 Codex 실행 중 Windows 자동 절전 방지.
Add-Type @"
using System;
using System.Runtime.InteropServices;
public static class SleepControl {
[DllImport("kernel32.dll")]
public static extern uint SetThreadExecutionState(uint esFlags);
}
"@
$ES_CONTINUOUS = 0x80000000
$ES_SYSTEM_REQUIRED = 0x00000001
try {
[SleepControl]::SetThreadExecutionState(
$ES_CONTINUOUS -bor $ES_SYSTEM_REQUIRED
) | Out-Null
Start-Sleep -Seconds $WaitSeconds
Write-Host ""
Write-Host "Codex를 재개합니다."
# & 를 사용하면 여러 줄 프롬프트도 하나의 인수로 전달됩니다.
& codex resume $SessionId $Prompt
}
finally {
# 절전 방지 해제
[SleepControl]::SetThreadExecutionState($ES_CONTINUOUS) | Out-Null
}










댓글 남기기