OS X에서 작업을 시작하는 것은, 리눅스와 비교하여 맥에서 작동하는 방식이 다소 혼란스러웠습니다. 완전히 정직하게 말하면 시스템 간의 차이를 둘러보면서 힘든 여행이었습니다.
OS X Sierra의 Launch Daemon에 스타트업 쉘 스크립트를 추가하는 것과 관련된 내 경험을 공유하고자 합니다. 더 나은 솔루션에 대한 제안을 환영합니다.
Launch Daemon Process에 대한 정보를 얻을 수 있는 좋은 출발점 - 여기에서 구성하는 법, 문제 해결 및 몇 가지 예를 찾을 수 있습니다.
Daemon 이란
데몬은 사용자 입력 없이 백그라운드에서 실행되는 프로그램입니다.
해결해야할 과제
- mariaDB를 시작하기 위한 셸 스크립트 파일 작성 (데모의 단순화를 위해)
- 컴퓨터가 부팅 되자마자 셸 스크립트 파일 실행 (예: 사용자가 로그인 하지 않아도 됨)
시작해봅시다
1단계 : 터미널을 사용하여 셸 스크립트 파일을 만듭니다.
vim ~/scripts/startup/startup.sh
이제 다음 코드를 파일에 추가하고 저장하고 종료합니다. 이는 mariadb 서비스의 활성화 여부를 우선적으로 체크하고 중지 된 경우 서비스를 시작합니다.
#!bin/bash
#Start Mariadb Server only if it is not running
if [ "$(ps -ef | grep -v grep | grep mariadb | wc -1)" -le 0 ]
then
# Note starting mariadb not as a sudoer
mariadb start
echo "Mariadb Server Started"
else
echo "Mariadb Server Already Running"
fi
스크립트 파일에 실행 허락을 부여합니다.
chmod +x ~/scripts/startup/startup.sh
2단계 : 컴퓨터가 부팅되는 즉시 셸 스크립트 파일을 시작합니다.
이제 Launch Daemon 프로세스에 스크립트 파일을 추가해야합니다. 이 프로세스는 Mac이 부팅되자마자 작업(Job)을 실행합니다.
업무(Job) 정의
데몬 / 에이전트의 동작은 속성 목록(property list)라는 특수 XML 파일에 지정되어 있습니다. 저장된 위치에 따라 데몬이나 에이전트로 처리됩니다.
다시, 데몬 / 에이전트 간 차이를 명확하게 하기 위해:
가장 큰 차이점은 에이전트는 로그인한 사용자 대신 실행되는 반면 데몬은 루트 사용자 또는 UserName 키로 지정한 사용자 대신 실행된다는 것입니다.
Mac OS X에서, Launch Daemon은 다음 폴더 내부에 저장되어 있습니다.
/Library/LaunchDaemons/
반면에 Launch Agent는 다음 폴더 내부에 저장되어 있습니다.
/Library/LaunchAgents/
이제, 루트 사용자로 property list 파일(.plist)을 작성합시다. (이 글의 범위를 벗어난 plist 파일의 이름을 지정하는 규칙이 있습니다.)
sudo vim /Library/LaunchDaemons/com.startup.plist
plist 파일의 구성은 사용 사례에 따라 다릅니다. 구성 할 수 있는 프로퍼티 목록은 launchd.info의 구성 섹션에 다시 잘 설명되어 있습니다.
보다 쉬운 설명을 위해, 아래 plist 파일과 인라인 주석을 확인하세요.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:sbin:</string>
</dict>
<key>Label</key>
<string>com.startup</string>
<key>Program</key>
<string>/Users/admin/Scripts/startup/startup.sh</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
<key>LaunchOnlyOnce</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/startup.stdout</string>
<key>StandardErrorPath</key>
<string>/tmp/startup.stderr</string>
<key>UserName</key>
<string>admin</string>
<key>GroupName</key>
<string>admin</string>
<key>InitGroups</key>
<true/>
</dict>
</plist>
이제 모든 필요한 파일을 갖췄으므로, 프로퍼티 리스트 파일을 launchctl에 다음과 같이 추가해야합니다.
# -w flag permanently adds the plist to the Launch Daemon
sudo launchctl load -w /Library/LauchDaemons/com.startup.plist
다른 메모,
- plist를 Launch Daemon에서 영구적으로 제거하려면
# -w flag permanently remove the plist to the lauch Daemon
sudo launchctl unload -w /Library/LauchDaemons/com.startup.plist
- 스크립트가 Launch Daemon에 추가되면 사용자가 다음 커맨드를 실행하더라도 자동 시작될 것입니다.
# Will only temporarily stop. It will again auto launch unless the service is explicitly stopped using launchctl unload command mariadb stop
#You can stop the launchctl process by
#sudo launchctl stop /Library/LaunchDaemons/com.startup.plist
#You can start the launchctl process by
#sudo launchctl start -w /Library/LaunchDaemons/com.startup.plist
- 소스 파일의 요지가 여기에 제공됩니다.
그게 답니다!
당신에게 잘 작동하는지 알려주세요. 개선에 대한 제안은 높이 평가될 겁니다.
출처:
1. Launchd 튜토리얼