OSX에서 /etc/cron.d/ 에뮬레이션

OSX에서 /etc/cron.d/ 에뮬레이션

대부분의 최신 UNIX에서 cron은 /etc/cron.d각 작업이 지정된 사용자로 실행되는 개별 crontab 파일을 지원합니다. 이러한 파일을 편집하면 crontab이 자동으로 업데이트됩니다. 이를 통해 개별 패키지는 전역 crontab을 오염시키거나 사용자별 crontab을 사용하지 않고도 자체 자동화 작업을 설치할 수 있습니다.

OSX는 이것을 지원하지 않는 것 같습니다. 이것이 사실입니까?

그렇다면 이를 구현하는 가장 좋은 방법은 무엇입니까? 저는 OSX에서 개발하지만 Linux에서 프로덕션 코드를 실행하기 때문에 launchd 대신 crond를 사용해야 합니다. 비록 후자가 잠재적인 이점이 있더라도 말입니다.

답변1

OS X에서는 launchd를 사용해야 합니다. 이를 구현하기 위해 예를 들어 설명하겠습니다.

해당 폴더로 이동하여 /Users/your-username/Library/LaunchAgents다음 plist 파일을 저장합니다. 이름을 로 지정했지만 com.username.testscript.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>Label</key>
  <string>com.your-username.testscript</string>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/your-username/bin/testscript.sh</string>
  </array>

  <key>Nice</key>
  <integer>1</integer>

  <key>StartInterval</key>
  <integer>60</integer>

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

  <key>StandardErrorPath</key>
  <string>/tmp/com.your-username.testscript.err</string>

  <key>StandardOutPath</key>
  <string>/tmp/com.your-username.testscript.out</string>
</dict>
</plist>

문서는 매우 자명합니다. 60초마다 명령을 실행 /Users/your-username/bin/testscript.sh하고 로드 시 실행되며 오류를 저장 /tmp/com.username.testscript.err하고 로그인합니다 /tmp/com.username.testscript.out.

디렉토리 /Library/LaunchAgents/또는 를 사용할 수도 있습니다 /Library/LaunchDaemos/.

답변2

OS X에서 평소처럼 crontab을 사용할 수 있습니다. 유일한 차이점은 사용자별 파일이 /usr/lib/cron/tabs/에 있다는 것입니다. 명령 은 corontab액세스 방법을 알고 있습니다. cron 데몬은 OS X에서 기본적으로 실행되지 않지만 launchd/usr/lib/cron/tabs/에 파일이 있거나 /etc/crontab이 있으면 시작됩니다.

말하자면 launchd: @jherran이 말했듯 launchd이 프로젝트는 OS X에서 이와 같은 작업을 수행하는 보다 일반적인 방법이지만 cron 작업과는 약간 다릅니다.

  • 프로젝트 에는 두 가지 주요 유형이 있습니다 launchd. LaunchDaemons(일반적으로 루트로 실행)와 LaunchAgents(일반 사용자로 실행되지만 로그인 세션 내에서만 실행)입니다. LaunchAgents는 /Library/LaunchAgents(로그인한 사용자에 대해 실행됨)에서 시스템 전체에 설치하거나 ~/Library/LaunchAgents(해당 사용자에 대해서만 실행됨)에 사용자별로 설치할 수도 있습니다. LaunchDaemons는 시스템 전체에만 설치할 수 있습니다.

    이와 대조적으로 크론 작업(사용자별 작업 포함)은 로그인 세션과 독립적으로 실행됩니다.

  • 컴퓨터가 예정된 시작 시간에 절전 모드이거나 종료되면 cron 작업을 건너뜁니다. launchd여러 번 놓친 실행이 단일 실행으로 병합되더라도 프로젝트는 다음 기회(예: 깨우기, 부팅, 로그인 등 후)에 실행됩니다.

  • cron은 실행 후 잊어버리는 방식으로 작업을 시작하고 launchd자식이 충돌하거나 종료되면 다시 시작할 수 있습니다 KeepAlive.남자 launchd.plist) 및/또는 시작한 하위 프로세스를 정리(즉, 종료)합니다( key 참조 AbandonProcessGroup). 작업이 자체적으로 보호되고 .plist 파일에서 관련 설정을 조정하지 않으면 많은 문제가 발생할 수 있습니다.

  • launchd프로젝트 시작 시기에 대한 더 많은 옵션 지원: 특정 시간, 시간 간격, 다양한 유형의 이벤트,항상 달리고 있다...다시 한 번 보세요남자 launchd.plist.

  • 마지막으로, launchd.plist 파일의 명령 형식은 많은 사람들을 혼란스럽게 합니다. launchd명령은 셸을 통해 실행되지 않으므로 변수 참조, ~경로, I/O 리디렉션 등은 효과가 없습니다. 또한 명령줄이 필요하지 않으며 ProgramArguments키에 단어의 "배열"이 필요하며 이는 본질적으로 명령과 인수로 처리됩니다. 예를 들어 다음 /path/to/somecommand -xv "arg number 1" arg2 arg3 >>/tmp/somecommand.log과 같이 작성할 수 있습니다.

    <key>ProgramArguments</key>
    <array>
        <string>/path/to/somecommand</string>
        <string>-xv</string>
        <string>arg number 1</string>
        <string>arg2</string>
        <string>arg3</string>
    </array>
    <key>StandardOutPath</key>
    <string>/tmp/somecommand.log</string>
    

    키가 하나 더 있지만 인수를 잘 이해하지 않는 한 Program사용하지 마세요 . execvp진심으로, 그러지 마세요.

    쉘이 명령을 해석하도록 해야 하는 경우 명시적으로 호출할 수 있습니다.

    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>-c</string>
        <string>~/bin/somecommand -xv "arg number 1" arg2 arg3 >>~/Desktop/somecommand.log</string>
    </array>
    

답변3

디렉토리 를 살펴보면 /usr/lib/cron.jobs/etc/cron.d

관련 정보