10 초마다 더 자주 프로그램을 실행할 수 있습니까?


8

파일을 수정 한 후 거의 즉시 실행하려는 서비스가 있습니다.

<?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>test</string>
    <key>ProgramArguments</key>
    <array>     
        <string>say</string>
        <string>a</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Users/username/Desktop/</string>
    </array>
</dict>
</plist>

ThrottleInterval이 1 또는 0으로 설정되어 있어도 최대 10 초마다 실행됩니다.

9/9/12 4:57:05.457 PM com.apple.launchd.peruser.501[138]: (test) Throttling respawn: Will start in 7 seconds
9/9/12 4:57:09.541 PM com.apple.launchd.peruser.501[138]: (test) Throttling respawn: Will start in 3 seconds

man launchd.plist 프로그램이 기본적으로 10 초마다 실행되지 않는다고 말하지만 ThrottleInterval을 그 아래로 설정할 수는 없습니다.

ThrottleInterval <integer>
This key lets one override the default throttling policy imposed on jobs by launchd.
The value is in seconds, and by default, jobs will not be spawned more than once
every 10 seconds.  The principle behind this is that jobs should linger around just
in case they are needed again in the near future. This not only reduces the latency
of responses, but it encourages developers to amortize the cost of program invoca-
tion.

프로그램이나 스크립트를 10 초 동안 계속 실행하고 매초마다 변경 사항을 감시 할 수 있습니다.

#!/bin/bash

start=$(date +%s)
prev=

until (( $(date +%s) >= $start + 10 )); do
    new=$(stat -f %m ~/Desktop/)
    [[ $prev != $new ]] && say a
    prev=$new
    sleep 1
done

또는 루비에서도 마찬가지입니다.

#!/usr/bin/env ruby

start = Time.now
prev = nil

until Time.now >= start + 10
  current = File.mtime("#{ENV['HOME']}/Desktop/")
  `say a` if current != prev
  prev = current
  sleep 1
end

그러나 시간 제한을 우회하거나 줄일 수있는 방법이 있습니까? 폴더 작업에도 적용됩니다.

답변:


9

시간 제한을 우회하거나 줄일 수있는 방법이 없습니다.

실행 된 작업 생성 에 관한 Apple의 설명서 는 다음과 같습니다.

중요 사항 데몬이 시작된 후 너무 빨리 종료되면 launchd가 다운되었다고 생각할 수 있습니다. 이 동작을 계속하는 데몬은 일시 중단되어 향후 요청이 도착하면 다시 시작되지 않을 수 있습니다. 이 동작을 피하려면 실행 후 10 초 이상 종료하지 마십시오.

프로그램 또는 스크립트가 10 초 이상 계속 실행되어야합니다. 지난 10 초 동안 파일 수정 날짜를 확인하기 위해 루프를 구현하고, 10 초 동안 휴면하고, 반복하는 것을 고려하십시오.

또는 kqueue 또는 FSEvents API를 사용하여 특정 파일을 볼 수 있습니다 . 이 StackOverflow 질문은 Mac OS X의 파일 수준 파일 시스템 변경 알림에 도움이 될 수 있습니다 .


2

수정 된 파일이 완료되면 종료하는 대신 검사하여 루프에서 스크립트를 계속 실행할 수 있습니다. 수정 된 파일을 확인한 후 몇 초 동안 절전 상태로 유지하십시오. 수정 된 파일을 찾으면 스크립트를 계속하십시오. 그렇지 않은 경우 다시 잠을 자십시오.

그런 다음 이전 실행이 중단되는 경우를 대비하여 x 분마다 스크립트 시작을 시작했습니다. 스크립트의 시작 부분을 코딩하여 다른 인스턴스가 이미 실행 중인지 확인하고 종료 된 경우 종료하십시오.


launchd는 이전 인스턴스가 여전히 실행중인 경우 다른 인스턴스를 시작하지 않는 것 같습니다.
Lri

launchd는 동일한 작업 티켓의 여러 인스턴스를 시작하지 않습니다.
Graham Miln

1

10 초마다 스크립트를 더 자주 시작해야하는 경우 "포킹"(읽기 : 메모리 할당, 새 프로세스 시작 등) 측면에서 비용이 많이들 수 있습니다.

따라서이 경우 자신의 " 데몬 "(프로그램, 백그라운드에서 실행되는 프로그램) 을 작성하는 것이 가장 좋습니다.

좋은 데몬이 타임 아웃, 알람 등을 처리하기 때문에 "유능한"언어를 BASH로 사용하는 것이 좋습니다. 순수한 bash에서는 구현하기가 너무 어렵습니다. 물론, 데몬은 bash 스크립트도 실행할 수 있습니다 (필요한 경우). 기본 사항은 다음과 같습니다.

  • 끝없이 실행되고 어떤 이벤트를 기다리는 스크립트. 이벤트는 네트워크 입력 또는 간단한 타이머 등일 수 있습니다. 이벤트가 도착하면 (예 : 대기 상태가 종료 됨) 스크립트가 원하는 작업을 수행하고주기가 반복됩니다.

펄 세계에는 스크립트를 "데몬"프로세스로 조정하는 모듈이 이미 있습니다 (예 : Proc :: Daemon) . 루비에 대해서는 경험 없지만 이 기사 가 도움 될 수 있습니다.

시스템 시작시 시작 또는 로그인 할 때 자동 응용 프로그램 또는 터미널에서 수동으로 데몬 프로세스를 시작할 수 있습니다.

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