본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

다시 만들지, 부활시키지 마

~12 min · restore, declaration, allowlist, boot-uuid, pid

Level 0불씨
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

저장해 둔 PID 는 유령이야

재부팅 뒤, 또는 데몬 자체가 사라진 뒤에, 적어 둔 숫자는 프로세스가 아니야. 지금은 다른 것 것이거나, 아무도 아닌 유령이야. 저장해 둔 PID 가 아직 살아 있다고 치는 복원은, 엉뚱한 일에 붙거나 아무것도 아닌 것에 붙고, 그다음 컴파일러가 돌아왔다고 말하는 길이야. 안 돌아왔어. 우연히 같은 번호의 새 프로세스는 옛 프로세스가 아니야. 부활이 거짓말이야. 다시 만들기가 진실이야. 이건 저장해 둔 레시피로 띄운 새 프로세스야.

레시피는 선언이야. 호스트, 명령, 디렉터리, 분할 기하, 자리 이름일 수도. 복원은 그 호스트의 그 디렉터리에서 그 명령을 다시 돌려. 저널의 마지막 줄을 긁어 바라지 않아. 중간에 잡힌 임의 명령은 부작용을 복제하는 길이야. 이미 돌린 배포, 이미 옮긴 마이그레이션, 이미 지운 rm. 저널은 출력의 이력이지, 입력으로 재생할 스크립트가 아니야.

허용 목록만이 저승이야

셸 레시피는 쉬워. 선언된 디렉터리에서 선언된 셸을 띄우면 돼. REPL 이나 편집기는 달라. 사람들은 python 이, 또는 vim 이, 파일 한가운데에 있던 셸로서가 아니라 자기 자신으로서 돌아오길 원해. 그 저승은 허용 목록에 있는 프로그램에만 열려. 기본 목록은 제품 결정이고, 운영자가 늘릴 수 있어. argv[0] 을 냄새 맡아 짐작하는 휴리스틱이 아니야. 목록에 없으면 복원은 선언된 셸을 주지, 빌드 한가운데 있던 컴파일러의 두 번째 사본을 주지 않아.

짐작은 명령의 위험한 반쪽을 부활시키는 길이야. 허용 목록은 어떤 전경 프로그램이 자기 자신으로 다시 시작해도 안전한지를 큰 소리로 말하는 길이야. 나머지는 레시피의 셸로 돌아와 기다려. 그 기다림은 빠진 기능이 아니야. 일을 복제하지 않겠다는 거절이야.

부트 UUID 가 선을 그어

살아있는 프로세스는 재부팅을 못 살아. 선언은 살아. 데몬에게는 다툴 수 없는 선이 필요해. 이번 부팅은 그 부팅이 아니다. 부트 UUID(sysctl kern.bootsessionuuid, 하드웨어 IOKit id 가 아님)가 그 선이야. 같은 부팅, 데몬이 살아 있으면 죽은 투영이 살아있는 일에 다시 붙을 수 있어. 같은 부팅에서 데몬이 다시 시작되면 PTY 는 없어. 복원은 선언으로 다시 만들어. 새 부팅, 살아있는 일은 없고, 복원은 선언만으로 다시 만들어. PID 를 얼마나 영리하게 저장해도 그 선을 정직하게 넘지 못해.

이게 폰이 설 맥 쪽 뿌이야. 지난주 PID 가 아직 있는 척하며 "복원"하는 주머니 표면은, 엉뚱한 곳에 치게 되는 주머니 표면이야. 복원은 크롬에서 진실을 말해. 새 프로세스, 옛 레시피. 돌릴지는 운영자가 정해.

복원은 레시피지 PID 가 아니야. 재부팅은 선언을 복원해. 살아있는 프로세스는 부팅과 함께 죽어. REPL 이나 편집기가 자기 자신으로 돌아오는 유일한 자리가 허용 목록이야.

Code

선언은 레시피야. PID 는 그 안에 없어·json
{
  "kind": "pane-declaration",
  "host": "local",
  "directory": "~/Projects/example",
  "command": "zsh",
  "foreground": {
    "program": "python",
    "restart": "allowlisted"
  },
  "geometry": { "rows": 40, "cols": 120, "split": "left" },
  "boot_uuid": "current-boot-or-none",
  "pid": null
}

# Restore (honest)
# Daemon crash or restart: PTYs are gone. Process identity is gone.
# Restore rematerializes declarations. It never reattaches a vanished PID.
# Remembered shells in a directory come back. SSH, workflows, and
# arbitrary commands do not auto-launch.
# Allowlisted foreground programs may restart as themselves.
# Everything else waits at the declared shell.
# Never take a command from the journal and type it.

External links

Exercise

복원 이야기 둘을 써. (1) 프로젝트 디렉터리의 셸에서 vim 이 열린 판, 재부팅 뒤. (2) 같은 디렉터리의 셸에서 make 가 한가운데인 판, 재부팅 뒤. 각각 무엇이 뜨고, 무엇이 안 뜨고, 옛 PID 가 돌아왔다고 아무도 생각 못 하게 크롬에 보여 줄 문장 하나를 이름 붙여.
Hint
vim 은 자기 자신으로 허용 목록에 오를 수 있어. make 는 못 해. 두 이야기가 같은 것을 띄우면, 허용 목록이 일을 안 한 거거나 복원이 아직 저널을 긁는 중이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.