자주 실행되도록 작업을 어떻게 설정합니까?


84

30 분마다 스크립트를 실행하려면 어떻게해야합니까? OS마다 다른 방법이 있다고 가정합니다. OS X를 사용하고 있습니다.

답변:


136

launchd를 사용하십시오 . 매우 강력한 실행기 시스템이며 동시에 Mac OS X 용 표준 실행기 시스템입니다 (현재 OS X 버전은 그것 없이는 부팅조차 할 수 없습니다). 익숙하지 않은 사람들을 위해 launchd(또는 일반적으로 OS X 포함), 그것은 사이의 잡종처럼 init, cron, at, SysVinit에서 ( init.d), inetd, upstartsystemd. 이 모든 프로젝트의 개념을 빌리면서 다른 곳에서는 찾을 수없는 것들을 제공합니다.

모든 서비스 / 작업은 파일입니다. 파일의 위치는 "이 서비스를 언제 실행해야합니까?"라는 질문에 따라 다릅니다. 및 "서비스에 필요한 권한은 무엇입니까?"

시스템 작업으로 이동

/Library/LaunchDaemons/

사용자가 시스템에 로그인했는지 여부에 관계없이 실행되는 경우. "루트"권한으로 시작됩니다.

경우에 그들은 단지 실행해야하는 경우 모든 사용자가 로그인, 그들로 이동

/Library/LaunchAgents/

방금 로그인 한 사용자의 권한으로 실행됩니다.

경우에 그들은 단지 실행해야하는 경우 사용자가 로그인, 그들은로 이동

~/Library/LaunchAgents/

여기서 ~는 홈 디렉토리입니다. 이 작업은 마치 명령 줄로 직접 시작했거나 Finder에서 파일을 두 번 클릭하여 사용자 권한으로 실행됩니다.

/System/Library/LaunchDaemons및 도 존재 /System/Library/LaunchAgents하지만 평소와 같이 아래에있는 모든 것은 /SystemOS X에서 관리합니다. 수행중인 작업을 실제로 알지 않는 한 여기에 파일을 배치해서는 안됩니다. 파일을 변경해서는 안됩니다. 시스템 폴더를 뒤섞 으면 시스템을 사용할 수 없게 될 수 있습니다 (다시 부팅을 거부하는 상태가 될 수도 있습니다). 이 디렉토리는 Apple이 launchd부팅 중에 시스템을 시작하고 실행하고, 필요에 따라 서비스를 자동으로 시작하고, 시스템 유지 관리 작업을 수행 하는 등의 작업을 배치하는 디렉토리 입니다.

모든 launchd작업에는 plist 형식의 파일이 있습니다. 역 도메인 이름 표기법이 있어야합니다. 예를 들어 작업 이름을 지정할 수 있습니다.

com.example.my-fancy-task.plist

이 plist는 다양한 옵션과 설정을 가질 수 있습니다. 한 손에 하나씩 쓰는 것은 차선책입니다. 무료 도구 Lingon 을 사용하여 작업을 생성하는 것이 좋습니다. 이 도구는 무료 였지만 이제는 앱 스토어에서 5 달러, 앱 스토어가 아닌 버전으로 10 달러의 비용이 듭니다 (앱 스토어가 아닌 버전이 훨씬 더 강력하며 이미 비용을 지불 할 계획이라면 진지하게 앱 스토어가 아닌 버전을 구입하십시오. 버전). 프리웨어 또는 오픈 소스와 유사한 도구를 아는 사람이 있으면 댓글에 한 줄을 남겨주세요. 대신 그 도구를 추천하겠습니다 (여기에서 상용 소프트웨어에 대해 광고하고 싶지 않음).

예를 들어 다음과 같이 보일 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//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.my-fancy-task</string>
    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/usr/local/bin/my-script.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>1800</integer>
</dict>
</plist>

이 에이전트는 1800 초마다 (30 분마다) 쉘 스크립트 /usr/local/bin/my-script.sh를 실행합니다. 또한 특정 날짜 / 시간에 작업을 실행하거나 (기본적으로 launchd는 cron이 할 수있는 모든 작업을 수행 할 수 있음) "OnDemand"를 비활성화하여 프로세스를 영구적으로 실행하도록 할 수도 있습니다 (종료되거나 충돌하는 경우 launchd가 즉시 다시 시작 함). . 프로세스가 사용할 수있는 리소스의 양을 제한 할 수도 있습니다 (이전에 말했듯이 Lingon은 이러한 모든 설정을 멋진 UI 인터페이스에 표시합니다).

업데이트 : 여전히 지원 되지만 OnDemand더 이상 사용되지 않습니다. 새 설정의 이름 KeepAlive은 훨씬 더 의미가 있습니다. 그것은 정반대 인 경우 부울 값을 가질 수있다 OnDemand(로 설정 false되는 경우와 같이 동작 OnDemand이며 true, 다른 방법으로 둥근). 새로운 기능은 부울 값 대신 사전 값을 가질 수도 있다는 것입니다. 사전 값이있는 경우 작업을 유지해야하는 상황에서보다 세부적으로 제어 할 수있는 몇 가지 추가 옵션이 있습니다. 예를 들어, 프로그램이 종료 코드 0으로 종료되는 한, 디스크의 특정 파일 / 디렉토리가 존재하는 한, 다른 작업도 활성 상태이거나 네트워크가 현재 작동중인 경우에만 활성 상태로 유지됩니다.

또한 명령 줄을 통해 수동으로 작업을 활성화 / 비활성화 할 수 있습니다.

launchctl <command> <parameter>

명령은로드 또는 언로드, plist를로드하거나 다시 언로드 할 수 있습니다.이 경우 매개 변수는 파일 경로입니다. 또는 명령은 시작 또는 중지가되어 이러한 작업을 시작하거나 중지 할 수 있습니다.이 경우 매개 변수는 레이블 (com.example.my-fancy-task)입니다. 다른 명령과 옵션도 있습니다.

plist 형식launchctl명령 줄 도구 에 대한 Apple의 설명서를 참조하십시오 (형식 / 옵션은 OS X 릴리스마다 다르므로 맨 위에서 OS X 버전을 선택할 수 있음).


사용자로서 로그인하지 않은 상태에서도 무언가를 실행하려면 어떻게해야합니까? 가능합니까, 아니면 관리자에게 / Library / LaunchDaemons에 무언가를 넣어달라고 요청해야합니까?
Mark Baker

@Mark : 예, 관리자가이 작업을 수행해야하며 UserName 및 GroupName 키가 .plist 파일에 적절하게 설정되어야합니다.
Steve Folly

또한 Leopard 이상에서는 KeepAlive 키 대신 OnDemand가 더 이상 사용되지 않습니다. 자세한 내용은 man launchd.plist를 참조하십시오.
Steve Folly

1
LaunchControl soma-zone.com/LaunchControl 은 매우 유용하며, 라이선스 버전에 대한 제한이 없다고 말할 수있는 한 무제한 평가판이 있습니다.
BaneOfSerenity

1
@MaciekRek StartCalendarInterval는 키 Minute와 값이 한 번 00이고 한 번인 두 사전의 배열을 사용하여 30요청한 것을 정확하게 수행합니다. 추후에 댓글이 아닌 질문으로 질문 해주시면 최종 사전도 보여 드릴 수 있습니다 (댓글로 할 수 없습니다). 이 사이트는 모두 질문에 관한 것입니다. 질문에 대한 힌트를 얻으려면 질문 자체가 아닌 질문에 대한 링크를 댓글로 게시하십시오.
Mecki

46

매우 편리한 plist 생성기를 사용할 수 있습니다 : http://launched.zerowidth.com/ (아무것도 살 필요가 없습니다…)

그것은 쉘 당신에게 이미 추천으로 새 예약 된 작업 등록을 한 줄 줄 것이다 launchd에를


11

MacOSX에는 최소한 다음 옵션이 있습니다.

  • "스크립트 실행"동작으로 반복되는 iCal 알람
  • 시작
  • cron ( link1 , link2 )

개인적인 경험으로 볼 때 cron이 가장 신뢰할 수 있습니다. 내가 테스트했을 때 launchd에는 많은 버그와 단점이있었습니다. iCal 알람은 로그인 할 때만 실행됩니다 (하지만 선호하는 것일 수 있음).


8

Mecki가 지적했듯이 launchd는 이것으로 갈 수있는 방법이 될 것입니다. 실행 된 파일을 수동으로 편집하는 것과 달리 체크 아웃 할 수있는 Lingon 이라는 launchd 용 GUI 인터페이스 가 있습니다.

Lingon은 Mac OS X Leopard 10.5 용 편집 실행 구성 파일을 만들기위한 그래픽 사용자 인터페이스입니다.

[한조각...]

이 버전에서는 구성 파일 편집이 그 어느 때보 다 쉬워졌으며 두 가지 모드가 있습니다. 매우 간단한 인터페이스에서 가장 일반적인 설정을 쉽게 사용할 수있는 기본 모드와 모든 설정을 텍스트에 직접 추가하거나 메뉴를 통해 삽입 할 수있는 전문가 모드입니다.


솔직히, 이것은 단지 그것을 완료하고 계속 진행할 수있게 해주는 훌륭하고 사용하기 쉬운 인터페이스입니다. 시간이 부족하다면 이것이 갈 길입니다.
Joshua Pinter

4

MAC OS에는 Windows 의 Task Scheduler 와 동일한 Automator Tool이 있습니다. 또한 Automator를 사용하면 매일 작업을 예약하고 반복 일정 이벤트와 작업을 연결하여 매일 지정된 시간에 스크립트를 실행할 수 있습니다. Mac OS에서 매일 스크립트를 실행하려면 링크 참조하십시오.


적어도 macOS Catalina (10.15.x)에서는 Automator를 통해 캘린더에서 작업을 예약하는 방법을 찾을 수 없었습니다. Lingon으로 훨씬 더 나은 결과를 얻었습니다 (시작할 인터페이스로 언급 된 다른 답변 참조).
calvinf

2

애플 스크립트의 경우 특별한 iCal 캘린더를 설정하고 알람을 사용하여 주기적으로 실행합니다. 명령 줄 도구의 경우 launchd를 사용합니다.


1

참고 : 간결함을 그리워하지만 cron은 OS X에서 과거의 일입니다. 팬더에 대한 감시자였습니다. Tiger 이후 출시되었습니다. 따라서 Leopard를 실행하는 경우 cron은 옵션이 아닙니다.


0

cron을 사용하여 작업을 예약 할 수 있습니다.

crontab -e

작업은 다음 형식으로 지정됩니다.

* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

예:

0 12 * * *  cd ~/backupfolder && ./backup.sh

크론 작업을 설치했으면 crontab -l을 사용하여 작업을 나열 할 수 있습니다.

crontab -l

cron 일정 표현식에 대해 더 알고 싶다면

https://crontab.guru https://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html

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