Yosemite에서 시작할 때 쉘 스크립트를 실행하는 방법


21

시스템 / 라이브러리에 내가 시작한 시작 항목에 대한 디렉토리가 있습니다. StartupItems

로컬 네트워크 주소와 서브넷 마스크를 사용하여 시작할 때 이더넷 인터페이스를 구성 할 쉘 스크립트가 필요합니다. 이더넷 인터페이스 구성을위한 네트워크 환경 설정이 수동 설정을 사용하여 설정하지 않기 때문에이 작업을 수행해야합니다. 이 버그는 심각한 버그로 보이거나 설치가 잘못되었습니다.

커맨드 라인에서 networksetup을 사용하라는 조언을 받았지만 재부팅시 구성이되도록 이더넷 인터페이스를 구성하지는 않습니다.

스크립트는 루트 권한 또는 sudo를 사용하여 작업을 수행해야하지만 sudo를 사용하는 경우 부팅 프로세스가 해당 스크립트에 도달 할 때 부팅시 비밀번호 대화 상자가 표시된다고 가정합니다.

(터미널에서 FreeBsd 및 Linux에 대한 경험이 충분했지만 Mac OSX에 적용되는 것은 아닙니다)

답변:


18

이를 수행하는 한 가지 방법은 스크립트에 실행 된 서비스를 지정하는 것입니다.

평소와 같이 쉘 스크립트를 작성하십시오. 그런 다음 시작시 서비스를 실행하기 위해 시작된 서비스를 만들 수 있습니다. 이들은에 있습니다 /Library/LaunchDaemons. 이들은 XML 속성 목록 형식입니다. 다른 것을 작성하고 다음과 같이 채우십시오.

<?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>Label</key>
        <string>com.example.app</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/sh</string>
            <string>/path/to/script</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <false/>
    </dict>
</plist>

변경 com.example.app, /bin/sh/path/to/script등이 필요합니다.

그런 다음 시스템이 부팅되는 동안 스크립트가 실행됩니다. 너무 일찍 실행되면 스크립트를 작성하여 성공할 때까지 수행해야 할 작업을 수행하거나 0이 아닌 오류 코드로 종료하여 </dict>행 앞의 특성 목록에 추가하십시오 .

<key>KeepAlive</key>
<dict>
     <key>SuccessfulExit</key>
     <false/>
</dict>

OS X 시작 데몬 및 서비스에 대한 자세한 내용을 보려면 여기 를 참조하여 빠른 참조를 시작하거나 시작된 작업에 대한 포괄적 인 참조를 참조 하십시오 .


이 plist 문서는 무엇입니까? 그리고 / path / to / script == / System / Library / StartupItems / script입니까?
JeffK

1
첫 번째 질문 : plist 문서의 이름은 일반적으로 속성 목록의 Label 키가 .plist 확장자로 설정된 (이 경우 "com.example.app") 것을 사용합니다.
andonuts

1
두 번째 질문 : 맞습니다. 그러나 스크립트를 다른 곳으로 옮겨야합니다.
andonuts

plist가 잘못되었습니다. : 당신은 키가 필요 <key>Program</key>값과 <string>/bin/sh</string>다음 <key>ProgramArguments</key>단지 값이 있어야합니다<string>/path/to/script</string>
존 브룩스

실제로, 내 잘못도 : <key>ProgramArguments</key>배열이 필요합니다.
Jon Brooks

16

얼마 전에 나는 cron을 사용하여 그 일을했습니다. 이런 식으로 항목을 만들 수 있습니다

@reboot /path/to/my/script

더 많은 정보는 여기에

처음 5 개의 필드 대신 8 개의 특수 문자열 중 하나가 나타날 수 있습니다.

       string          meaning
       ------          -------@reboot ------@reboot
       @reboot         Run once, at startup.
       @yearly         Run once a year, "0 0 1 1 *".
       @annually       (same as @yearly)
       @monthly        Run once a month, "0 0 1 * *".
       @weekly         Run once a week, "0 0 * * 0".
       @daily          Run once a day, "0 0 * * *".
       @midnight       (same as @daily)
       @hourly         Run once an hour, "0 * * * *".

1
알고 매우 편리합니다!
geotheory

7
cron요즘 OS X 에서이 작업을 수행하는 올바른 방법은 아닙니다. 대신 LaunchAgent 또는 LaunchDeamon을 사용하십시오 (시작). 더 많은 정보를 원하시면 : developer.apple.com/library/mac/documentation/MacOSX/Conceptual/… Although it is still supported, cron is not a recommended solution. It has been deprecated in favor of launchd.
CousinCocaine

4
cronlaunchd그래도 구성하는 것이 훨씬 쉽습니다 . 이 스레드의 두 답변을 비교하여 의미하는 바를 확인하십시오. 부팅 할 때 실행할 스크립트를 설명하는 스크립트가 필요한 cron단일 파일에 단일 행을 사용합니다 launchd.
Dannid

@Dannid Kron은 복제, 대기열 버퍼링 등을 실행하는 데 민감하지 않습니다. 이 경우에는 실행 가능하지만 항상 골격 키는 아니며 관용적 솔루션도 아닙니다.
새로운 Alexandria

Crontab이 더 좋습니다. 유닉스 세계에서 빠르고 더럽고 오래 확립되었습니다. 나는이 @reboot 키워드를 완전히 파헤친다.
macetw

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.