영닥터 아틀라스영닥터의 열린 AI 작업실

4층 자동화·운영 (launchd / 작업 스케줄러)② 사용자micro · 2~3분어디서나완성

내 컴퓨터에서 이미 저절로 도는 것들 — 30초 목록 읽기

설치 없이 명령 한 줄(맥 launchctl list · 윈도우 작업 스케줄러)로 내 컴퓨터에 등록된 예약 작업 전체를 띄워 보고, 내가 건 것과 앱이 건 것을 가른 뒤 마지막 종료 코드 열이 무엇을 뜻하는지 읽는다.

이 노드가 끝나면 이 노드를 마치면 「자동화」가 이미 내 컴퓨터 안에서 돌고 있다는 것을 눈으로 보고, 어떤 잡이 내 것이고 어느 열이 성공·실패를 말하는지 30초 안에 읽을 수 있다.

재방문 키 지도 L4-②, 검색어 ‘first-job’

함께 걸치는 칸: L4-S3

글

자동화는 새로 배워야 할 먼 기술처럼 들리지만, 내 컴퓨터 안에서는 이미 여러 일이 정해진 시각에 저절로 돌고 있습니다. 이 칸에서는 맥 터미널에 명령 한 줄을 쳐서 그 목록을 띄우고, 운영체제 것·앱이 건 것·내가 건 것을 가른 뒤, 두 번째 열의 숫자가 무엇을 말하는지 읽습니다. 설치할 것도, 관리자 권한도 필요 없습니다. 윈도우 절은 아직 준비 중입니다.

자동화라고 하면 아직 먼 이야기처럼 들립니다. 그런데 내 컴퓨터 안에서는 이미 여러 일이 저절로 돌고 있습니다.

이 칸을 마치면, 그 목록을 화면에 띄우고 어느 줄이 누구 것인지, 어느 열이 성공과 실패를 말하는지 읽을 수 있습니다. 설치할 것은 없습니다.

맥의 터미널에서 launchctl list 한 줄을 칩니다. 제작자의 맥에서는 550줄 남짓이 쏟아졌습니다. 맨 위 머리줄은 PID, Status, Label 세 낱말입니다. 대부분은 com.apple로 시작하는 운영체제 자신의 것이라, 이것을 빼고 보면 50여 줄만 남습니다.

남은 줄은 셋으로 가릅니다. application으로 시작하는 줄은 지금 열어 둔 앱입니다. 앱 만든 곳의 이름으로 시작하는 줄은 브라우저 업데이터처럼 앱이 걸어 둔 예약 작업입니다. 내가 정한 앞머리로 시작하는 줄이 내가 건 것인데, 아직 하나도 없다면 그것이 정상입니다.

첫 열이 줄표면 지금은 떠 있지 않고 예약 시각을 기다리는 중입니다. 두 번째 열은 마지막 종료 상태입니다. 0이면 마지막에 오류 없이 끝났다는 뜻이고, 다른 숫자면 마지막에 실패했다는 신호입니다. 제작자는 저절로 돌던 수집기 둘이 한꺼번에 멈췄을 때 이 열 하나로 범인을 바로 찾았습니다. 다만 둘의 원인은 서로 달랐습니다. 숫자는 범인을 가리킬 뿐, 원인을 말해 주지는 않습니다.

처음 목록을 열면 마이너스 9 같은 숫자가 잔뜩 보여서 고장 난 줄 압니다. 그 줄은 거의 다 운영체제 것입니다. 운영체제 것은 빼고 봅니다.

그리고 0이어도 일을 했다는 뜻은 아닙니다. 다음은 매일 아침 저절로 오는 묵상 메모 한 통을 내 손으로 거는 일입니다. 막히는 곳이 있으면 이 페이지 아래 묻기 칸에 남겨 주세요.

목록 한 장 — 세 열

launchctl list는 인자 없이 부르면 등록된 잡 전체를 세 열로 보여 줍니다. 아래는 모양을 보이기 위한 가공 예시입니다(실제 화면이 아닙니다).

PID Status  Label
-   0   com.apple.example-agent
-   -9  com.apple.example-helper
812 0   application.org.example.notes.1234.5678
-   0   org.example.browser.updater.wake
-   0   com.example.morning-memo
-   1   com.example.inbox-sweep
4127    0   com.example.mini-server
열 보이는 것 뜻
1열 PID - 지금은 떠 있지 않다. 정해진 시각에만 도는 잡은 평소 이렇다
숫자 지금 떠 있는 프로세스다. 상시로 떠 있게 만든 잡이 이렇다
2열 Status 0 마지막에 오류 없이 끝났다
음수 신호로 멈췄다. 설명서의 예: -15 = SIGTERM으로 종료
그 밖의 숫자 마지막에 실패했다. 숫자의 뜻은 그 프로그램이 정한다
3열 Label 앞머리 누가 건 잡인지 가르는 단서

누구 것인가 — 앞머리로 가른다

줄의 앞머리 누구 것 할 일
com.apple. 운영체제 건드리지 않는다. grep -v com.apple로 빼고 본다
application. 지금 열어 둔 앱 예약 작업과 섞어 읽지 않는다
앱 만든 곳의 이름 앱이 설치 때 건 예약 작업(예: 브라우저 업데이터) 사람이 만든 자동화가 아니다
내가 정한 앞머리 내가 건 것 아직 없으면 0줄이 정상
  • 정의 파일이 들어 있는 폴더(~/Library/LaunchAgents)로는 가를 수 없습니다. 설명서는 이 폴더를 「사용자가 둔 것」이라 부르지만, 제작자의 폴더에는 앱 설치가 만든 파일이 여럿 섞여 있었습니다. 가르는 기준은 폴더가 아니라 3열의 앞머리입니다.
  • 내 잡의 앞머리가 둘로 갈려 있으면 grep 한 번에 다 잡히지 않습니다. 제작자의 잡도 앞머리 두 가지로 갈려 있었습니다.
  • 꺼 둔 잡(정의 파일 이름 끝을 .plist.disabled로 바꿔 둔 것)은 폴더에는 남아도 목록에는 나오지 않습니다.
  • 컴퓨터를 두 대 쓰면 목록도 두 장입니다. 이 폴더는 컴퓨터마다 따로입니다.

2열은 범인을 가리킬 뿐이다

제작자의 컴퓨터에서는 메신저 기록·편지·아침 브리핑·백업 같은 일이 저절로 쌓이도록 몇 달에 걸쳐 여남은 개의 잡을 하나씩 붙였습니다. 그중 수집기 둘이 같은 달에 함께 멈췄을 때, launchctl list | grep <이름> 한 줄로 2열이 1인 것과 2인 것이 바로 드러났습니다. 그런데 1은 예약 실행에 디스크 접근 권한이 없어 죽은 것이었고, 2는 서비스를 옮긴 뒤 남은 옛 주소 때문이었습니다. 숫자는 「어느 잡을 볼지」를 알려 줄 뿐 「왜」를 알려 주지 않습니다.

0도 마찬가지입니다. 0은 「마지막에 오류 없이 끝났다」일 뿐 「일을 했다」가 아닙니다. 판정은 2열과 산출물(또는 로그)의 날짜를 함께 봐야 하고, 그 이야기는 깊은 칸에서 이어집니다.

더 읽기

  • 목록 읽기 카드 — 명령 세 줄과 세 열·앞머리 읽는 법을 한 장에.
  • 다음 노드: 매일 아침 저절로 오는 묵상 메모 한 통 (L4-S2-first-daily-memo)
  • 깊은 칸: 「자동 실행」이라 적힌 것을 믿지 않는다 — 산출물 날짜로 판정 (L4-S4-proof-by-output-date)
  • 깊은 칸: 조용히 죽는 잡의 정체 — 코드가 아니라 실행 컨텍스트 (L4-S4-silent-death-context)
  • 출처: macOS 내장 설명서 man launchctl

가져갈 자료

해보기

해보기 (10분)

준비물: 맥 한 대. 설치할 것도, 관리자 권한(sudo)도 필요 없다. 아래 명령은 모두 읽기만 한다 — 아무것도 등록하거나 바꾸지 않는다.

  1. 터미널 앱을 연다.
  2. 아래 명령을 치고 엔터를 누른다. 긴 목록이 쏟아진다. 맨 위 머리줄 PID Status Label 세 낱말을 찾는다.
launchctl list
  1. 운영체제 것을 빼고 다시 본다. 제작자의 맥에서는 550줄 남짓이 50여 줄로 줄었다. -9가 잔뜩이던 줄도 거의 다 빠진 쪽에 있었다.
launchctl list | grep -v com.apple
  1. 남은 줄을 셋으로 가른다. ① application.으로 시작 = 지금 열어 둔 앱 ② 앱 만든 곳의 이름으로 시작 = 앱이 건 예약 작업(업데이터 등) ③ 내가 정한 앞머리 = 내가 건 것. ③이 0줄이면 정상이다. 열린 앱 줄만 따로 보려면:
launchctl list | grep application.
  1. 아무 줄 하나를 골라 1열·2열을 소리 내어 읽는다.
  2. 1열 - = 지금은 떠 있지 않다(예약 시각을 기다리는 중) / 숫자 = 지금 떠 있다
  3. 2열 0 = 마지막에 오류 없이 끝났다 / 음수 = 신호로 멈췄다 / 그 밖의 숫자 = 마지막에 실패했다(뜻은 그 프로그램이 정한다)
  4. (선택, +2분) 정의 파일이 든 폴더를 들여다본다. 내가 걸지 않은 앱의 파일이 섞여 있을 수 있다 — 그래서 폴더가 아니라 앞머리로 가른다.
ls ~/Library/LaunchAgents
  1. 한 줄만 기억해 둔다. 0이어도 일을 했다는 뜻은 아니다 — 그건 깊은 칸에서.

실물에서는 이렇게 보입니다

영상과 글의 목록은 가공 예시다. 내 화면과는 이렇게 대응한다.

PID Status  Label
-   0   com.apple.example-agent
-   -9  com.apple.example-helper
812 0   application.org.example.notes.1234.5678
-   0   org.example.browser.updater.wake
-   0   com.example.morning-memo
-   1   com.example.inbox-sweep
4127    0   com.example.mini-server
  • 머리줄은 PID·Status·Label 세 낱말이고, 열 사이는 탭으로 띄워져 있다.
  • 떠 있지 않은 잡은 1열이 숫자 대신 -다.
  • 1·2행 = 운영체제 것(-9도 여기) · 3행 = 지금 열린 앱 · 4행 = 앱이 건 업데이터 · 5~7행 = 내가 건 것(가공 앞머리 com.example). 5행은 예약 시각을 기다리는 중이고 마지막엔 오류 없이 끝났다. 6행은 마지막에 실패했다 — 먼저 볼 줄이다. 7행은 지금 떠 있는 상시 잡이다.
  • 내 화면에는 내가 건 줄(5~7행 같은 것)이 없을 수 있다. 정상이다.

맥

  • 위 명령 그대로다. 설치·sudo 없이 바로 나온다.
  • 설명서는 list 대신 print를 권하지만, list도 그대로 동작한다. 이 칸은 list만 쓴다.

윈도우

  • 윈도우에서는 작업 스케줄러가 같은 자리를 맡지만, 제작자는 이 칸을 아직 윈도우에서 직접 재어 보지 않았다. 여는 길, 목록의 열 이름, 「마지막 실행 결과」에 해당하는 값의 표기는 실기에서 잰 뒤 이 자리에 보탠다.
  • 먼저 해 본 사람이 있으면 이 페이지 아래 묻기 칸에 알려 주면 다음 사람에게 도움이 된다.

됐다

  • 화면에 세 열짜리 목록이 보인다.
  • 그 목록에서 「앱이 건 것」 한 줄을 짚고, 그 줄의 2열 숫자가 무슨 뜻인지 말할 수 있다.

🔴 함정

숫자가 잔뜩 보여서 고장 난 줄 안다

처음 하는 사람이 겪는 막힘

0이 아닌 숫자가 잔뜩인 줄은 거의 다 운영체제 것이다 — com.apple을 빼고 본다.

launchctl list를 처음 치면 수백 줄이 쏟아지고, 2열에 -9 같은 숫자가 줄줄이 보인다. 제작자의 맥에서도 0이 아닌 줄이 200건 남짓이었는데, 그 대부분이 -9였고 -9는 전부 com.apple.로 시작하는 운영체제 자신의 줄이었다. 내 컴퓨터가 망가졌다는 뜻이 아니다.

대응: launchctl list | grep -v com.apple로 운영체제 것을 빼고 본다. 운영체제 줄은 건드리지 않는다. 그다음 남은 줄 가운데 2열이 0이 아닌 줄만 「먼저 볼 줄」로 짚는다.

막혔을 때 먼저 볼 것

  1. 숫자가 잔뜩 보여서 고장 난 줄 안다

이 칸에서 막힌 것 묻기

답은 이 칸의 FAQ에 익명으로 올라갑니다(보통 7일 안). 연락처를 남기면 직접도 보냅니다. 이메일 수집·로그인 없음.