{
  "schema_version": 1,
  "observed_at": "2026-09-21T14:18:01.889967+00:00",
  "environment": {
    "os": "Linux",
    "python": "3.10.12",
    "systemd": "systemd 249 (249.11-0ubuntu3.22)",
    "scope": "disposable --user units, runtime enablement only"
  },
  "method": "고유 이름의 사용자 서비스·타이머를 만들었다. 작업은 임시 파일에 PID 한 줄을 남긴 뒤 대기했다. 서비스의 Restart=no, 타이머의 OnUnitInactiveSec=2s 조건에서 stop과 disable을 비교했다. 종료 시 실험 유닛과 실행 프로세스를 정리했다.",
  "limits": "재부팅, cron, 외부 watchdog, Persistent=true의 누락된 달력 일정, mask는 실행 실험하지 않았다. 중지 뒤 추가 실행 여부의 관찰 창은 4초이며 영구 중지를 증명하는 부하 시험은 아니다.",
  "unit_name": "punchblog-timer-lab-ad670aa37b2b",
  "units": {
    "service": "[Unit]\nDescription=Punchblog disposable timer experiment\nConditionPathExists=!/tmp/punchblog-timer-lab-ad670aa37b2b-17gpc9u0/completed\n[Service]\nType=simple\nExecStart=/usr/bin/python3 /tmp/punchblog-timer-lab-ad670aa37b2b-17gpc9u0/worker.py /tmp/punchblog-timer-lab-ad670aa37b2b-17gpc9u0/runs.txt\nRestart=no\nRuntimeMaxSec=40\nTimeoutStopSec=3\nMemoryMax=64M\nCPUQuota=10%\nNice=15\n",
    "timer": "[Unit]\nDescription=Punchblog disposable timer experiment trigger\n[Timer]\nOnActiveSec=2s\nOnUnitInactiveSec=2s\nAccuracySec=100ms\nUnit=punchblog-timer-lab-ad670aa37b2b.service\n[Install]\nWantedBy=timers.target\n"
  },
  "observations": [
    {
      "case": "initial",
      "runs": 1,
      "service": {
        "MainPID": "2515471",
        "ActiveState": "active",
        "SubState": "running",
        "UnitFileState": "static",
        "ConditionResult": "yes"
      },
      "timer": {
        "ActiveState": "active",
        "SubState": "running",
        "UnitFileState": "enabled-runtime",
        "ConditionResult": "yes"
      }
    },
    {
      "case": "stop_service_only",
      "runs": 2,
      "service": {
        "MainPID": "2515478",
        "ActiveState": "active",
        "SubState": "running",
        "UnitFileState": "static",
        "ConditionResult": "yes"
      },
      "timer": {
        "ActiveState": "active",
        "SubState": "running",
        "UnitFileState": "enabled-runtime",
        "ConditionResult": "yes"
      }
    },
    {
      "case": "disable_timer_only",
      "runs": 2,
      "service": {
        "MainPID": "2515478",
        "ActiveState": "active",
        "SubState": "running",
        "UnitFileState": "static",
        "ConditionResult": "yes"
      },
      "timer": {
        "ActiveState": "active",
        "SubState": "running",
        "UnitFileState": "disabled",
        "ConditionResult": "yes"
      }
    },
    {
      "case": "disabled_timer_still_triggers",
      "runs": 3,
      "service": {
        "MainPID": "2515490",
        "ActiveState": "active",
        "SubState": "running",
        "UnitFileState": "static",
        "ConditionResult": "yes"
      },
      "timer": {
        "ActiveState": "active",
        "SubState": "running",
        "UnitFileState": "disabled",
        "ConditionResult": "yes"
      }
    },
    {
      "case": "disable_now_timer",
      "runs": 3,
      "service": {
        "MainPID": "2515490",
        "ActiveState": "active",
        "SubState": "running",
        "UnitFileState": "static",
        "ConditionResult": "yes"
      },
      "timer": {
        "ActiveState": "inactive",
        "SubState": "dead",
        "UnitFileState": "disabled",
        "ConditionResult": "no"
      }
    },
    {
      "case": "stop_timer_and_service",
      "runs": 3,
      "service": {
        "MainPID": "0",
        "ActiveState": "inactive",
        "SubState": "dead",
        "UnitFileState": "static",
        "ConditionResult": "no"
      },
      "timer": {
        "ActiveState": "inactive",
        "SubState": "dead",
        "UnitFileState": "disabled",
        "ConditionResult": "no"
      }
    },
    {
      "case": "completion_guard",
      "runs": 3,
      "service": {
        "MainPID": "0",
        "ActiveState": "inactive",
        "SubState": "dead",
        "UnitFileState": "static",
        "ConditionResult": "no"
      },
      "timer": {
        "ActiveState": "inactive",
        "SubState": "dead",
        "UnitFileState": "disabled",
        "ConditionResult": "no"
      }
    }
  ],
  "commands": [
    {
      "arguments": [
        "daemon-reload"
      ],
      "exit_code": 0,
      "stdout": "",
      "stderr": ""
    },
    {
      "arguments": [
        "enable",
        "--runtime",
        "--now",
        "punchblog-timer-lab-ad670aa37b2b.timer"
      ],
      "exit_code": 0,
      "stdout": "",
      "stderr": "Created symlink /run/user/1000/systemd/user/timers.target.wants/punchblog-timer-lab-ad670aa37b2b.timer → /run/user/1000/systemd/user/punchblog-timer-lab-ad670aa37b2b.timer."
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.service",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "MainPID=2515471\nActiveState=active\nSubState=running\nUnitFileState=static\nConditionResult=yes",
      "stderr": ""
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.timer",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "ActiveState=active\nSubState=running\nUnitFileState=enabled-runtime\nConditionResult=yes",
      "stderr": ""
    },
    {
      "arguments": [
        "stop",
        "punchblog-timer-lab-ad670aa37b2b.service"
      ],
      "exit_code": 0,
      "stdout": "",
      "stderr": "Warning: Stopping punchblog-timer-lab-ad670aa37b2b.service, but it can still be activated by:\n  punchblog-timer-lab-ad670aa37b2b.timer"
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.service",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "MainPID=2515478\nActiveState=active\nSubState=running\nUnitFileState=static\nConditionResult=yes",
      "stderr": ""
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.timer",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "ActiveState=active\nSubState=running\nUnitFileState=enabled-runtime\nConditionResult=yes",
      "stderr": ""
    },
    {
      "arguments": [
        "disable",
        "--runtime",
        "punchblog-timer-lab-ad670aa37b2b.timer"
      ],
      "exit_code": 0,
      "stdout": "",
      "stderr": "Removed /run/user/1000/systemd/user/timers.target.wants/punchblog-timer-lab-ad670aa37b2b.timer."
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.service",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "MainPID=2515478\nActiveState=active\nSubState=running\nUnitFileState=static\nConditionResult=yes",
      "stderr": ""
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.timer",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "ActiveState=active\nSubState=running\nUnitFileState=disabled\nConditionResult=yes",
      "stderr": ""
    },
    {
      "arguments": [
        "stop",
        "punchblog-timer-lab-ad670aa37b2b.service"
      ],
      "exit_code": 0,
      "stdout": "",
      "stderr": "Warning: Stopping punchblog-timer-lab-ad670aa37b2b.service, but it can still be activated by:\n  punchblog-timer-lab-ad670aa37b2b.timer"
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.service",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "MainPID=2515490\nActiveState=active\nSubState=running\nUnitFileState=static\nConditionResult=yes",
      "stderr": ""
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.timer",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "ActiveState=active\nSubState=running\nUnitFileState=disabled\nConditionResult=yes",
      "stderr": ""
    },
    {
      "arguments": [
        "disable",
        "--runtime",
        "--now",
        "punchblog-timer-lab-ad670aa37b2b.timer"
      ],
      "exit_code": 0,
      "stdout": "",
      "stderr": ""
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.service",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "MainPID=2515490\nActiveState=active\nSubState=running\nUnitFileState=static\nConditionResult=yes",
      "stderr": ""
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.timer",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "ActiveState=inactive\nSubState=dead\nUnitFileState=disabled\nConditionResult=no",
      "stderr": ""
    },
    {
      "arguments": [
        "stop",
        "punchblog-timer-lab-ad670aa37b2b.service"
      ],
      "exit_code": 0,
      "stdout": "",
      "stderr": ""
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.service",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "MainPID=0\nActiveState=inactive\nSubState=dead\nUnitFileState=static\nConditionResult=no",
      "stderr": ""
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.timer",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "ActiveState=inactive\nSubState=dead\nUnitFileState=disabled\nConditionResult=no",
      "stderr": ""
    },
    {
      "arguments": [
        "start",
        "punchblog-timer-lab-ad670aa37b2b.service"
      ],
      "exit_code": 0,
      "stdout": "",
      "stderr": ""
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.service",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "MainPID=0\nActiveState=inactive\nSubState=dead\nUnitFileState=static\nConditionResult=no",
      "stderr": ""
    },
    {
      "arguments": [
        "show",
        "punchblog-timer-lab-ad670aa37b2b.timer",
        "-p",
        "ActiveState",
        "-p",
        "SubState",
        "-p",
        "UnitFileState",
        "-p",
        "MainPID",
        "-p",
        "ConditionResult"
      ],
      "exit_code": 0,
      "stdout": "ActiveState=inactive\nSubState=dead\nUnitFileState=disabled\nConditionResult=no",
      "stderr": ""
    },
    {
      "arguments": [
        "disable",
        "--runtime",
        "--now",
        "punchblog-timer-lab-ad670aa37b2b.timer"
      ],
      "exit_code": 0,
      "stdout": "",
      "stderr": ""
    },
    {
      "arguments": [
        "stop",
        "punchblog-timer-lab-ad670aa37b2b.service"
      ],
      "exit_code": 0,
      "stdout": "",
      "stderr": ""
    },
    {
      "arguments": [
        "daemon-reload"
      ],
      "exit_code": 0,
      "stdout": "",
      "stderr": ""
    },
    {
      "arguments": [
        "reset-failed",
        "punchblog-timer-lab-ad670aa37b2b.service",
        "punchblog-timer-lab-ad670aa37b2b.timer"
      ],
      "exit_code": 1,
      "stdout": "",
      "stderr": "Failed to reset failed state of unit punchblog-timer-lab-ad670aa37b2b.service: Unit punchblog-timer-lab-ad670aa37b2b.service not loaded.\nFailed to reset failed state of unit punchblog-timer-lab-ad670aa37b2b.timer: Unit punchblog-timer-lab-ad670aa37b2b.timer not loaded."
    }
  ],
  "cleanup": {
    "unit_files_removed": true,
    "timer_enable_link_removed": true,
    "worker_pids_gone": true
  },
  "tables": {
    "states": {
      "headers": [
        "관찰 시점",
        "누적 실행",
        "서비스",
        "타이머",
        "타이머 등록"
      ],
      "rows": [
        [
          "최초 타이머 시작",
          1,
          "active",
          "active",
          "enabled-runtime"
        ],
        [
          "서비스만 stop 후 다음 실행",
          2,
          "active",
          "active",
          "enabled-runtime"
        ],
        [
          "타이머만 disable 직후",
          2,
          "active",
          "active",
          "disabled"
        ],
        [
          "disabled 타이머가 다시 실행",
          3,
          "active",
          "active",
          "disabled"
        ],
        [
          "타이머 disable --now 직후",
          3,
          "active",
          "inactive",
          "disabled"
        ],
        [
          "서비스도 stop 후 4초 관찰",
          3,
          "inactive",
          "inactive",
          "disabled"
        ],
        [
          "완료 파일 생성 후 수동 start",
          3,
          "inactive",
          "inactive",
          "disabled"
        ]
      ]
    }
  }
}
