'시작된'작업이 감시 된 파일의 변경 사항에 응답하지 않는 이유는 무엇입니까?


3

나는이 launchd때 파일 변경을 유발하지 않는 작업을하고, 실패 왜 알아낼 수 없습니다.

내가 .plist아래를 로드하면

launchctl load /Users/Rax/Library/LaunchAgents/com.crashplan.status.plist

지정된 스크립트가 한 번 실행되고 예상대로 실행됩니다 (명령 줄에서 직접 성공적으로 실행할 수도 있습니다). 그러나 감시 경로 ( /Library/Logs/CrashPlan/history.log.0) 의 파일이 변경되면 아무 일도 일어나지 않습니다.

이 작업이 파일 변경에 응답하지 못하게 할 수있는 것이 무엇입니까?


<?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.crashplan.status</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Rax/Library/Automation/Shell/crashplan_status</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Library/Logs/CrashPlan/history.log.0</string>
    </array>
</dict>
</plist>

답변:


2

FWIW 나는 그것을 여기에서 시도했고 그것은 나를 위해 일하는 것 같다. /Library/Logs/CrashPlan/history.log.0에 수동으로 무언가를 추가 할 때마다 스크립트가 트리거되었습니다.

따라서 이것은 실제로 답이 아니지만 디버깅에 대한 일련의 팁입니다 launchd.

진단을위한 몇 가지 팁이 시작되었습니다.

1) stdoutstderr경로를 사용하여 기록 된 것이 있는지 확인하십시오. 이 줄을 com.crashplan.status.plist파일 에 추가하면 됩니다.

<key>StandardErrorPath</key>
<string>/tmp/com.crashplan.status.stderr.log</string>
<key>StandardOutPath</key>
<string>/tmp/com.crashplan.status.stdout.log</string>

(여러 사람이 동일한 Mac을 사용하는 경우 / tmp /와 다른 경로를 사용하고 싶을 수도 있지만 자신 만있는 경우에는 다른 곳과 마찬가지로 좋습니다.)

2) # 1을 사용하면 스크립트 시작 / 시간과 같은 디버깅 정보를 포함하도록 스크립트 (/ Users / Rax / Library / Automation / Shell / crashplan_status)를 조정할 수도 있습니다. 스크립트 상단 근처에 다음과 같이 추가 된 것처럼 간단 할 수 있습니다.

echo "$0: started at `date`"

그리고 끝 근처에서 이와 같은

echo "$0: finished at `date`"

3) # 2를 사용 하면 적어도 디버깅 단계를 지나갈 때까지 스크립트가 호출 될 때 표시하기 위해 터미널 알림 과 같은 것을 사용할 수도 있습니다 .

4) 그래도 도움이되지 않으면 호출중인 명령의 종료 상태를 확인하고 명령이 crashplan_status올바르게 종료되는지 확인해야합니다. 예를 들어, 당신이 실행되었다고 가정 해 봅시다 echocrashplan_status

5) 환경이 launchd쉘과 다른 점이 있습니까? 실행 된 스크립트 상단에 다음 줄을 추가하여 가장 잘 확인됩니다.

/usr/bin/printenv | /usr/bin/open -ef

그러면 printenvstdout으로 전송되고 결과가 TextEdit에서 열립니다.

내가 겪는 가장 일반적인 '환경'문제는 $ PATH가 제대로 시작되지 않은 것입니다. 일반적으로 .bashrc와 같은 쉘 초기화 파일에 설정되며 터미널에서 실행하는 쉘 스크립트에 의해 상속되지만 launchd.

다음 launchd을 통해 사용 중인 경로를 확인할 수 있습니다 .

launchctl getenv PATH

설정하려면 다음과 같이 설정하십시오.

launchctl setenv PATH

예를 들어 내 시스템의 경우 다음과 같습니다.

launchctl setenv /Users/luomat/Dropbox/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin

컴퓨터를 시작할 때마다 설정을 기억하지 않으려면 다음 줄을 추가하여 컴퓨터를 추가 할 수 있습니다 /etc/launchd.conf.

setenv PATH /Users/luomat/Dropbox/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin

분명히 시스템과 일치하도록 변경하십시오. 또한 /etc/launchd.conf시스템에 존재하지 않아도 놀라지 마십시오 . 작성해야 할 수도 있습니다. 그렇게하려면 간단한 것을 권장합니다.

sudo pico -w /etc/launchd.conf

편집이 끝나면 control+를 누르고 X프롬프트에 따라 변경 사항을 저장하십시오.


0

나는 이것이 오래된 게시물이라는 것을 알고 있지만 실제 답변이 없으므로 제안을 게시 할 것입니다. 여전히 문제가 있거나 마지막으로 해결 되었습니까? 그렇지 않은 경우 동일한 문제를 실험 할 때 실마리가있을 수 있습니다.

터미널에서 다음 명령을 사용하여 감시 파일에 확장 인수가 있는지 확인하십시오.

ls -l@

파일에 다음과 같은 확장 된 인수가있는 경우 :

com.apple.quarantine    32

확장 인수를 제거하려면이 명령을 시도하고 입력하십시오 (필요한 경우 sudo 사용).

xattr -d -r com.apple.quarantine /Library/Logs/CrashPlan/history.log.0

당신의 경우에…

시작된 감시 경로가 격리 된 인수를 격리 한 파일을 무시하는 것 같습니다.

그것이 도움이되기를 바랍니다.

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