본문 바로가기

Engineering/Mac

서비스 데몬 시작/등록 on MacOS

728x90

MacOS 에 부팅시 시작할 프로그램을 등록하기 위해 launchctl 을 이용하는 방법

애플에서 제작한 데몬과는 구분을 위해 /Library/LaunchDaemons 에 추가하기로 했다. - launchctd 로 스크립트 관리

 

Mac용 터미널에서 launchd로 스크립트 관리하기

Mac의 터미널에서 launchd를 사용하여 셸 스크립트를 데몬으로 실행할 수 있습니다.

support.apple.com

 

 launchctl 은 redhat 계열의 systemctl, service 랑 비슷한 데몬(서비스) 관리 명령어로 보인다.

% cd /Library/LaunchDaemons
 
% pwd
/Library/LaunchDaemons

% ls -la
total 64
drwxr-xr-x  11 root       wheel   352 Aug 14 13:39 .
drwxr-xr-x  68 root       wheel  2176 Jul 22 14:59 ..
-rw-r--r--   1 web_admin  staff   646 Aug 14 12:04 com.boos.testapp.plist
-rw-r--r--   1 root       wheel   428 Jul 17 11:42 com.microsoft.autoupdate.helper.plist
-rw-r--r--   1 root       wheel  1005 Jul  9 06:34 com.microsoft.dlp.install_monitor.plist
-rw-r--r--   1 root       wheel   739 Jul  9 06:34 com.microsoft.fresno.plist
-rw-r--r--   1 root       wheel   960 Jul  9 06:34 com.microsoft.fresno.uninstall.plist
lrwxr-xr-x   1 root       wheel   103 Jun  8  2020 com.oracle.java.Helper-Tool.plist -> /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Resources/com.oracle.java.Helper-Tool.plist
-rw-r--r--   1 root       wheel  1124 Jan 28  2021 crash.report.symbolicator.plist

% launchctl load com.boos.testapp.plist
Warning: Expecting a LaunchAgents path since the command was ran as user. Got LaunchDaemons instead.
`launchctl bootstrap` is a recommended alternative.
Load failed: 5: Input/output error
Try running `launchctl bootstrap` as root for richer errors.

 

일반 유저(web_admin) 계정으로 com.boos.testapp.plist 로 시작하려고 진행했는데, /Library/LaunchAgents 에서 등록하라고 warning 메시지가 나오고, launchctl list 로 확인해보면 데몬이 안보인다.

스크립트를 /Library/LaunchAgents 로 옮기고 서비스 시작(load) 을 해도 "Load failed: " 오류는 동일하게 나온다. 

% launchctl load com.boos.testapp.plist 
Load failed: 5: Input/output error
Try running `launchctl bootstrap` as root for richer errors.

 

그냥 /Library/LaunchDaemons 에 스크립트를 두고 시작/등록할 수 있는 방법을 알아보았다.

 

방법은 스크립트의 소유자가 일반 사용자인데, root 로 바꿔서 등록하면 된다.

# chown root:wheel 스크립트
sh-3.2# ls -la
total 64
drwxr-xr-x  11 root       wheel   352 Aug 14 13:59 .
drwxr-xr-x  68 root       wheel  2176 Jul 22 14:59 ..
-rw-r--r--   1 web_admin  staff   646 Aug 14 12:04 com.boos.testapp.plist
-rw-r--r--   1 root       wheel   428 Jul 17 11:42 com.microsoft.autoupdate.helper.plist
-rw-r--r--   1 root       wheel  1005 Jul  9 06:34 com.microsoft.dlp.install_monitor.plist
-rw-r--r--   1 root       wheel   739 Jul  9 06:34 com.microsoft.fresno.plist
-rw-r--r--   1 root       wheel   960 Jul  9 06:34 com.microsoft.fresno.uninstall.plist
lrwxr-xr-x   1 root       wheel   103 Jun  8  2020 com.oracle.java.Helper-Tool.plist -> /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Resources/com.oracle.java.Helper-Tool.plist
-rw-r--r--   1 root       wheel  1124 Jan 28  2021 crash.report.symbolicator.plist
-rw-r--r--@  1 netmarble  staff   991 Jun  8  2020 meerkat.system.symbol.uploader.plist
-rw-r--r--   1 netmarble  staff   385 Jun  8  2020 nas.plist
sh-3.2# chown root:wheel com.boos.testapp.plist 
sh-3.2# ls -la
total 64
drwxr-xr-x  11 root       wheel   352 Aug 14 13:59 .
drwxr-xr-x  68 root       wheel  2176 Jul 22 14:59 ..
-rw-r--r--   1 root       wheel   646 Aug 14 12:04 com.boos.testapp.plist
-rw-r--r--   1 root       wheel   428 Jul 17 11:42 com.microsoft.autoupdate.helper.plist
-rw-r--r--   1 root       wheel  1005 Jul  9 06:34 com.microsoft.dlp.install_monitor.plist
-rw-r--r--   1 root       wheel   739 Jul  9 06:34 com.microsoft.fresno.plist
-rw-r--r--   1 root       wheel   960 Jul  9 06:34 com.microsoft.fresno.uninstall.plist
lrwxr-xr-x   1 root       wheel   103 Jun  8  2020 com.oracle.java.Helper-Tool.plist -> /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Resources/com.oracle.java.Helper-Tool.plist
-rw-r--r--   1 root       wheel  1124 Jan 28  2021 crash.report.symbolicator.plist
-rw-r--r--@  1 netmarble  staff   991 Jun  8  2020 meerkat.system.symbol.uploader.plist
-rw-r--r--   1 netmarble  staff   385 Jun  8  2020 nas.plist
sh-3.2# launchctl load com.boos.testapp.plist
sh-3.2# launchctl list | grep {앱 label}

 

시스템 시작시 서비스가  시작되게 하려면 plist 파일에 "RunAtLoad" 키값을 true 로 설정하고 리부팅해서 확인하자.

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <false/>

 

참고:

https://www.reddit.com/r/macsysadmin/comments/wrn5dn/launchctl_errors/

https://gist.github.com/johndturn/09a5c055e6a56ab61212204607940fa0