←→ Underneath: Background Apps · 모든 Mac 가이드

Mac을 재시동하면 앱이 다시 실행되는 이유

종료했습니다. 활성 상태 보기에서 강제 종료까지 했습니다. 그런데 2초 후, 또는 다음 재시동 후에 다시 실행되고 있습니다. 무언가가 의도적으로 시작하고 있는 것입니다. Mac에서 그 무언가는 거의 언제나 launchd입니다.

요약: 그 앱에는 launchd 작업이 있습니다. RunAtLoad는 로그인할 때마다 작업을 시작하고, KeepAlive는 멈출 때마다 다시 시작합니다. 프로세스를 종료해도 작업은 바뀌지 않습니다. 완전히 멈추려면 프로세스가 아니라 작업을 비활성화하십시오.

launchd란

launchd는 macOS가 가장 먼저 시작하는 프로세스(프로세스 ID 1)이며, 그 밖의 거의 모든 것을 시작합니다. launchd는 작은 .plist 파일을 읽습니다. 이 파일을 작업이라고 부르며, 무엇을 언제 실행할지 담고 있습니다. 각 작업에는 레이블이 있는데, com.google.keystone.agent 같은 고유한 이름입니다.

앱은 작업을 ~/Library/LaunchAgents, /Library/LaunchAgents 또는 /Library/LaunchDaemons에 설치하거나, 자체 앱 번들 안에서 등록합니다.

앱을 다시 불러오는 키

다음은 전형적인 LaunchAgent입니다.

<key>Label</key>
<string>com.example.helper</string>
<key>ProgramArguments</key>
<array>
  <string>/Applications/Example.app/Contents/MacOS/Helper</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
키효과보이는 현상
RunAtLoad로드되자마자 작업을 시작합니다. 즉, 로그인할 때마다(에이전트) 또는 시동할 때마다(데몬)재시동할 때마다 실행되어 있음
KeepAlive = true프로세스가 종료될 때마다 다시 시작강제 종료해도 소용없고, 몇 초 만에 돌아옴
KeepAlive(조건 포함)충돌 후(SuccessfulExit = false)나 네트워크가 연결된 동안 등 특정 경우에만 다시 시작다시 나타날 때도 있고 아닐 때도 있음
StartIntervalN초마다 실행나타나서 잠깐 실행되고 사라지기를 반복함
StartCalendarIntervalcron처럼 정해진 시간에 실행매일 같은 시간에 나타남
WatchPaths파일이나 폴더가 변경되면 실행관련 없는 작업을 한 뒤에 나타남

계속 종료되는 작업의 경우 launchd는 다시 시작하기 전에 약 10초를 기다리므로, KeepAlive 작업이 ‘깜박이는’ 것처럼 보일 수도 있습니다.

앱이 다시 실행되는 그 밖의 이유

원인 찾기

  1. 작업 레이블을 찾습니다. 앱이나 개발자 이름의 일부를 사용해 launchctl list | grep -i example을 실행합니다. 세 번째 열이 레이블입니다.
  2. 작업 내용을 읽습니다.
    launchctl print gui/$(id -u)/com.example.helper
    path(plist 파일), state, runs(시작된 횟수), last exit code를 확인합니다. 실행 횟수가 많다면 대개 KeepAlive 때문입니다.
  3. plist를 열고 RunAtLoad, KeepAlive, 간격 키를 확인합니다.
  4. 작업이 없다면 ‘로그인 시 열기’와 앱 자체 설정을 확인합니다.

중지와 비활성화의 차이

하는 일다시 실행될까?
프로세스 종료 또는 강제 종료예: KeepAlive면 즉시, RunAtLoad면 다음 로그인 시
launchctl bootout gui/$(id -u)/label지금은 아니요. RunAtLoad면 다음 로그인 시 예
launchctl disable gui/$(id -u)/label + bootout아니요, launchctl enable을 실행할 때까지
plist를 LaunchAgents 밖으로 이동 + bootout아니요, 다시 옮길 때까지
‘백그라운드에서 허용’에서 끄기아니요, 다시 켤 때까지

단계별 명령어는 LaunchAgent를 안전하게 비활성화하는 방법에 있습니다.

자주 묻는 질문

활성 상태 보기에서 종료한 프로세스가 곧바로 다시 시작되는 이유는 무엇입니까?

해당 launchd 작업에 KeepAlive가 설정되어 있기 때문입니다. launchd는 프로세스를 감시하다가 종료되면 다시 시작합니다. 프로세스를 종료하는 대신 launchctl bootout으로 작업을 중지하십시오.

RunAtLoad는 무슨 뜻입니까?

RunAtLoad는 launchd plist의 키입니다. 값이 true이면 launchd는 plist를 로드하자마자 작업을 시작합니다. LaunchAgent의 경우 로그인할 때마다 시작된다는 뜻입니다.

KeepAlive는 무슨 뜻입니까?

KeepAlive는 launchd에게 작업을 계속 실행 상태로 유지하라고 지시합니다. 프로세스가 종료되거나 강제로 종료되면 launchd가 다시 시작합니다. 충돌 후에만 다시 시작하는 것처럼 조건의 집합으로 지정할 수도 있습니다.

LaunchAgent를 중지하는 것과 비활성화하는 것은 어떻게 다릅니까?

중지(launchctl bootout)는 다음 로그인이나 재시동 때까지 작업을 언로드합니다. 비활성화(launchctl disable, 또는 plist를 LaunchAgents 밖으로 이동)는 재시동 후에 작업이 다시 로드되지 않게 합니다.