GNU/_PAGE/library/document/2026.01.11_ghost_daemon.php
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>유령 데몬 사건 – 완전 메뉴얼</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        body { font-family: 'Noto Sans KR', sans-serif; overflow-x: hidden; }
        code { font-family: 'JetBrains Mono', monospace; }
        .glass-panel {
            background: rgba(30, 41, 59, 0.7);
            backdrop-filter: blur(10px);
            border: 1px solid rgba(255, 255, 255, 0.1);
        }
        .gradient-text {
            background: linear-gradient(to right, #60a5fa, #c084fc);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }

        /* 동적 표현을 위한 애니메이션 설정 */
        .reveal {
            opacity: 0;
            transform: translateY(30px);
            transition: all 0.8s ease-out;
        }
        .reveal.active {
            opacity: 1;
            transform: translateY(0);
        }
        
        /* 딜레이 설정을 위한 유틸리티 */
        .delay-100 { transition-delay: 100ms; }
        .delay-200 { transition-delay: 200ms; }
        .delay-300 { transition-delay: 300ms; }
    </style>
</head>
<body class="bg-slate-900 text-slate-300 min-h-screen selection:bg-blue-500 selection:text-white w-full">

    <!-- Header / Title Area: 폭 100% 및 좌우 마진 300px 적용 -->
    <header class="w-full pt-16 pb-8 px-[300px] text-center reveal">
        <div class="inline-block px-3 py-1 mb-4 text-xs font-bold tracking-wider text-red-400 uppercase border border-red-900/50 bg-red-900/20 rounded-full">
            <i class="fas fa-triangle-exclamation mr-1"></i> Critical Operation Manual
        </div>
        <h1 class="text-4xl md:text-5xl font-bold text-white mb-4 leading-tight">
            유령 데몬 사건 <br>
            <span class="gradient-text">완전 메뉴얼</span>
        </h1>
        <p class="text-slate-400 text-sm md:text-base">
            실체 규명 · 대응 · 설계 원칙<br>
            <span class="text-slate-500">작성일: 2026-01-03 05:52:46 (Asia/Seoul)</span>
        </p>
    </header>

    <!-- Main Section: 폭 100% 및 좌우 마진 300px 적용 -->
    <main class="w-full px-[300px] pb-20 space-y-12">

        <!-- 0. 목적 -->
        <section class="bg-red-500/10 border-l-4 border-red-500 p-6 rounded-r-lg reveal">
            <h2 class="text-xl font-bold text-red-400 mb-3 flex items-center">
                <span class="bg-red-500 text-slate-900 w-6 h-6 rounded-full flex items-center justify-center text-xs mr-3">0</span>
                이 문서의 목적 (중요)
            </h2>
            <p class="text-slate-200 mb-4 font-bold">이 문서는 메모가 아니다.</p>
            <p class="mb-4">이번 “유령 데몬 사건”의 <strong>전 과정, 판단, 실체 규명, 최종 설계 결론</strong>을 다음에도 <strong>다시 헷갈리지 않기 위해</strong> 남기는 <strong>운영 메뉴얼</strong>이다.</p>
            <ul class="space-y-2 text-sm text-slate-300">
                <li class="flex items-start"><i class="fas fa-check text-red-500 mt-1 mr-2"></i> 감정/추측/기억에 의존하지 않는다</li>
                <li class="flex items-start"><i class="fas fa-check text-red-500 mt-1 mr-2"></i> 증거 기반 판단만 기록한다</li>
                <li class="flex items-start"><i class="fas fa-check text-red-500 mt-1 mr-2"></i> 다음에 같은 일이 발생하면 <strong>이 문서 그대로 따라 하면 끝나게</strong> 한다</li>
            </ul>
        </section>

        <!-- 1. 요약 -->
        <section class="reveal">
            <h2 class="text-2xl font-bold text-white mb-6 border-b border-slate-700 pb-2">1. 사건 요약</h2>
            <div class="glass-panel p-8 rounded-xl text-center">
                <i class="fas fa-quote-left text-4xl text-slate-700 mb-4 block"></i>
                <p class="text-lg md:text-xl text-slate-100 font-medium leading-relaxed">
                    데몬이 죽지 않는 문제가 아니라,<br>
                    <span class="text-blue-400">유저 세션(pmaadmin)이 지속적으로 데몬을 재생성하고 있었다.</span>
                </p>
            </div>
        </section>

        <!-- 2. 현상 -->
        <section class="reveal">
            <h2 class="text-2xl font-bold text-white mb-6 border-b border-slate-700 pb-2">2. 처음 나타난 현상</h2>
            <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
                <div class="bg-slate-800 p-4 rounded-lg flex items-center"><i class="fas fa-database text-slate-500 w-8"></i> <span>daemon_upbit_Ticker 데이터 무한 적재</span></div>
                <div class="bg-slate-800 p-4 rounded-lg flex items-center"><i class="fas fa-file-circle-xmark text-slate-500 w-8"></i> <span>파일 삭제/수정에도 계속 작동</span></div>
                <div class="bg-slate-800 p-4 rounded-lg flex items-center"><i class="fas fa-skull text-slate-500 w-8"></i> <span>Kill 명령에도 좀비처럼 부활</span></div>
                <div class="bg-slate-800 p-4 rounded-lg flex items-center"><i class="fas fa-ghost text-slate-500 w-8"></i> <span>"유령 데몬"으로 인식됨</span></div>
            </div>
        </section>

        <!-- 3. 잘못된 가설들 -->
        <section class="reveal">
            <h2 class="text-2xl font-bold text-white mb-6 border-b border-slate-700 pb-2">3. 잘못된 가설들 (뻘짓 정리)</h2>
            <div class="space-y-4">
                <div class="bg-slate-800/50 border border-slate-700 p-5 rounded-lg opacity-75 hover:opacity-100 transition">
                    <h3 class="font-bold text-red-400 mb-2"><i class="fas fa-xmark mr-2"></i>가설 1: DB 이벤트(event_scheduler)가 범인</h3>
                    <p class="text-sm">event_scheduler는 ON이었지만 실제 EVENTS는 비어 있었음 <br>→ <span class="text-slate-400">범인 아님</span></p>
                </div>
                <div class="bg-slate-800/50 border border-slate-700 p-5 rounded-lg opacity-75 hover:opacity-100 transition">
                    <h3 class="font-bold text-red-400 mb-2"><i class="fas fa-xmark mr-2"></i>가설 2: 데몬 프로세스가 혼자 살아 있음</h3>
                    <p class="text-sm">데몬을 kill 해도 다시 생김. 파일을 수정해도 영향 없음 <br>→ <span class="text-slate-400">데몬은 원인이 아니라 <strong>결과물</strong></span></p>
                </div>
                <div class="bg-slate-800/50 border border-slate-700 p-5 rounded-lg opacity-75 hover:opacity-100 transition">
                    <h3 class="font-bold text-red-400 mb-2"><i class="fas fa-xmark mr-2"></i>가설 3: 파일에 exit 넣으면 데몬이 멈춘다</h3>
                    <p class="text-sm">파일 정지는 미래 실행 차단일 뿐, 이미 떠 있는 데몬에는 영향 없음 <br>→ <span class="text-slate-400">개념 혼동</span></p>
                </div>
            </div>
        </section>

        <!-- 4 & 5. 실체 규명 -->
        <div class="grid grid-cols-1 md:grid-cols-2 gap-8">
            <section class="reveal">
                <h2 class="text-2xl font-bold text-white mb-6 border-b border-slate-700 pb-2">4. 결정적 전환점</h2>
                <div class="bg-slate-800 p-5 rounded-lg h-full">
                    <p class="text-sm text-slate-400 mb-2">핵심 질문: "누가 실제로 DB에 INSERT를 치고 있는가?"</p>
                    <div class="bg-black p-3 rounded mb-4 border border-slate-700">
                        <code class="text-green-400 text-sm">SHOW FULL PROCESSLIST;</code>
                    </div>
                    <p class="text-sm mb-4">1~2초 간격, 최소 10~20회 연속 실행 후 포착된 증거:</p>
                    <ul class="text-sm space-y-1 bg-slate-900 p-3 rounded border-l-2 border-yellow-500">
                        <li>User: <strong class="text-white">pmaadmin</strong></li>
                        <li>Host: localhost</li>
                        <li>Command: Query</li>
                        <li>Info: INSERT INTO...</li>
                    </ul>
                    <p class="mt-4 text-center font-bold text-yellow-400">👉 진범 확정</p>
                </div>
            </section>

            <section class="reveal">
                <h2 class="text-2xl font-bold text-white mb-6 border-b border-slate-700 pb-2">5. 최종 실체 규명</h2>
                <div class="bg-green-900/10 border border-green-900 p-5 rounded-lg h-full">
                    <div class="mb-6">
                        <h3 class="text-green-400 font-bold mb-2"><i class="fas fa-check-circle mr-2"></i>진범</h3>
                        <p class="text-sm">
                            <strong>유저 세션 (웹 계층)</strong><br>
                            DB 계정: pmaadmin<br>
                            php / phpMyAdmin / 웹 요청을 통해 매우 짧게 INSERT → COMMIT → 종료
                        </p>
                    </div>
                    <div>
                        <h3 class="text-green-400 font-bold mb-2"><i class="fas fa-check-circle mr-2"></i>데몬의 정체</h3>
                        <p class="text-sm">
                            데몬은 <strong>유령</strong>이다.<br>
                            스스로 존재하지 않으며, <strong>명령자가 살려내는 결과물</strong>일 뿐이다.
                        </p>
                    </div>
                </div>
            </section>
        </div>
        <br><br>
        <!-- 6 & 7. 원인 분석 -->
        <section class="bg-slate-800 p-6 rounded-lg reveal">
            <h3 class="font-bold text-white mb-4">💡 왜 계속 안 잡혔으며, 왜 죽여도 안 됐는가?</h3>
            <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
                <div>
                    <h4 class="text-slate-400 text-sm font-bold uppercase mb-2">스텔스성</h4>
                    <p class="text-sm text-slate-300">INSERT가 찰나의 순간에 실행되고 사라짐. SHOW PROCESSLIST 한두 번으로는 "없는 것처럼" 보임.</p>
                </div>
                <div>
                    <h4 class="text-slate-400 text-sm font-bold uppercase mb-2">무한 재생성</h4>
                    <p class="text-sm text-slate-300">데몬을 죽이면 명령자(유저 세션)가 이를 감지하거나 재실행하여 <strong>새로운 PID로 다시 태어남.</strong></p>
                </div>
            </div>
            <div class="mt-6 p-4 bg-slate-900 rounded text-center border border-slate-700">
                <p class="font-medium text-slate-200">"데몬을 못 죽인 게 아니라, 죽여도 계속 다시 만들어졌던 것"</p>
            </div>
        </section>

        <!-- 8. 정답 구조 -->
        <section class="reveal">
            <h2 class="text-2xl font-bold text-white mb-6 border-b border-slate-700 pb-2">8. 정답 구조 (원칙)</h2>
            <div class="flex flex-col md:flex-row gap-4">
                <div class="flex-1 bg-slate-800 p-5 rounded-lg border-t-4 border-slate-600">
                    <div class="text-2xl font-bold text-slate-500 mb-2">1</div>
                    <h3 class="text-white font-bold">데몬은 관리 대상 X</h3>
                    <p class="text-sm text-slate-400 mt-2">쫓아다닐 필요 없음. 결과물일 뿐.</p>
                </div>
                <div class="flex-1 bg-slate-800 p-5 rounded-lg border-t-4 border-blue-500">
                    <div class="text-2xl font-bold text-blue-500 mb-2">2</div>
                    <h3 class="text-white font-bold">명령자가 핵심 통제 대상</h3>
                    <p class="text-sm text-slate-400 mt-2">실행, 중지, 재생성의 주체는 명령자다.</p>
                </div>
                <div class="flex-1 bg-slate-800 p-5 rounded-lg border-t-4 border-green-500">
                    <div class="text-2xl font-bold text-green-500 mb-2">3</div>
                    <h3 class="text-white font-bold">파일 레벨 제어</h3>
                    <p class="text-sm text-slate-400 mt-2">파일이 곧 실행 여부이자 신분증이다.</p>
                </div>
            </div>
        </section>

        <!-- 9 ~ 11. 솔루션 코드 -->
        <section class="space-y-8">
            <div class="reveal">
                <h2 class="text-xl font-bold text-white mb-4"><i class="fas fa-shield-halved mr-2 text-blue-400"></i>9. 파일 중지 가드 (Future Block)</h2>
                <div class="bg-black rounded-lg p-4 border border-slate-700 font-mono text-sm">
<pre><span class="text-pink-400">&lt;?php</span>
<span class="text-slate-500">// DAEMON EXECUTION BLOCKED</span>
<span class="text-blue-400">exit</span>;
</pre>
                </div>
                <p class="text-sm text-slate-400 mt-2 ml-1">
                    <i class="fas fa-info-circle mr-1"></i> 미래의 실행을 100% 차단하지만, 이미 떠 있는 데몬은 별도 사살 필요.
                </p>
            </div>

            <div class="reveal">
                <h2 class="text-xl font-bold text-white mb-4"><i class="fas fa-id-card mr-2 text-blue-400"></i>11. 고유 ID 전략</h2>
                <div class="bg-black rounded-lg p-4 border border-slate-700 font-mono text-sm">
<pre><span class="text-purple-400">$DAEMON_ID</span> = <span class="text-yellow-400">pathinfo</span>(<span class="text-blue-400">__FILE__</span>, PATHINFO_FILENAME);
</pre>
                </div>
                <p class="text-sm text-slate-400 mt-2 ml-1">
                    파일명이 곧 고유 ID다.
                </p>
            </div>
        </section>

        <!-- 10 & 13. 프로세스 & 원칙 -->
        <section class="reveal">
             <h2 class="text-2xl font-bold text-white mb-6 border-b border-slate-700 pb-2">10. 대응 프로세스 & 13. 최종 원칙</h2>
             <div class="bg-gradient-to-br from-slate-800 to-slate-900 p-6 rounded-xl border border-slate-700">
                <h3 class="text-lg font-bold text-white mb-4">🚀 사살과 재발 방지 순서</h3>
                <ol class="list-decimal list-inside space-y-3 text-slate-300 mb-8 border-b border-slate-700 pb-8">
                    <li><strong class="text-white">파일 무력화</strong> (중지 가드 삽입 or 파일명 변경)</li>
                    <li><strong class="text-white">이미 떠 있는 데몬 1회 사살</strong></li>
                    <li>이후 감시 (끝)</li>
                </ol>

                <h3 class="text-lg font-bold text-white mb-4">⚖️ 불변의 운영 원칙</h3>
                <ul class="space-y-2 text-sm text-slate-400">
                    <li class="flex items-center"><i class="fas fa-gavel w-6 text-slate-600"></i> 데몬은 태어나지 못하게 한다.</li>
                    <li class="flex items-center"><i class="fas fa-gavel w-6 text-slate-600"></i> 이미 태어난 건 한 번만 죽인다.</li>
                    <li class="flex items-center"><i class="fas fa-gavel w-6 text-slate-600"></i> 모든 제어는 PHP 파일로 한다.</li>
                    <li class="flex items-center"><i class="fas fa-gavel w-6 text-slate-600"></i> 유저 세션은 실행만 하고 판단하지 않는다.</li>
                    <li class="flex items-center"><i class="fas fa-gavel w-6 text-slate-600"></i> 파일명이 곧 고유 ID다.</li>
                </ul>
             </div>
        </section>

        <!-- 14. 의미 -->
        <section class="text-center pt-8 reveal">
            <h2 class="text-xl font-bold text-white mb-4">14. 이 문서의 의미</h2>
            <div class="inline-block bg-slate-800 px-8 py-6 rounded-lg border border-slate-600">
                <p class="mb-4 text-slate-300">
                    추측의 기록 <span class="text-red-500">❌</span><br>
                    감정의 기록 <span class="text-red-500">❌</span><br>
                    <span class="text-green-400 font-bold">실체 규명과 정답 설계의 기록 ⭕</span>
                </p>
                <p class="font-bold text-white text-lg">
                    "다음에 같은 증상이 오면, <span class="text-blue-400 underline decoration-2 underline-offset-4">이 문서 1번부터 그대로 따라 하면 끝</span>"
                </p>
            </div>
        </section>

    </main>

    <footer class="text-center py-10 text-slate-600 text-sm border-t border-slate-800 reveal">
        <p>&copy; 2026 Ghost Daemon Incident Post-Mortem. End of Document.</p>
    </footer>

    <!-- 스크롤 시 동적 노출을 위한 자바스크립트 -->
    <script>
        function reveal() {
            var reveals = document.querySelectorAll(".reveal");
            for (var i = 0; i < reveals.length; i++) {
                var windowHeight = window.innerHeight;
                var elementTop = reveals[i].getBoundingClientRect().top;
                var elementVisible = 150;
                if (elementTop < windowHeight - elementVisible) {
                    reveals[i].classList.add("active");
                }
            }
        }

        window.addEventListener("scroll", reveal);

        // 초기 로딩 시 첫 화면에 보이는 요소들 활성화
        window.addEventListener("load", reveal);
    </script>

</body>
</html>