응용 프로그램을 서비스로 실행


0

나는 다음과 같은 것을 가지고있다. applescript 번들로 .app (Platypus 사용) 및 사용자 로그온시 시작 (각 사용자 당 12.4MB)

#!/usr/bin/osascript

-- INICIO DAS FUNCOES EXTRAS
set app_path to path to current application
set app_name to get name of me
set myPath to path to me
tell application "Finder" to set myFolder to (container of myPath) as string
set commonScript to load script alias ((myFolder) & "FuncoesExtras.scpt")
-- FIM DAS FUNCOES EXTRAS

set WhiteList to {app_name, "App Store", "iTunes", "FecharProgramas", "Finder", "Mail"}

repeat

    tell application "System Events"
        repeat with this_app in (get processes whose background only is false and windows is {})
            set NomeDoApp to the name of this_app
            if NomeDoApp is not in WhiteList then
                try
                    tell NomeDoApp to quit
                    log_event("App " & NomeDoApp & " encerrado com sucesso", app_name) of commonScript
                on error
                    do shell script "killall " & quoted form of NomeDoApp
                    log_event("Forcando interrupcao do App " & NomeDoApp, app_name) of commonScript
                end try
            end if
        end repeat
    end tell

    tell application "System Events" to set myPID to (unix id of processes whose name is app_name)
    do shell script ("/usr/bin/renice 18 " & myPID)

    delay 60

end repeat

어떻게하면 서비스로 만들 수 있습니까? 따라서 사용자 로그온이 아닌 시스템이 시작될 때 인스턴스가 1 개만 실행됩니다.

내 코드에 대한 다른 제안 사항이 있습니까?


편집하다

여기 내 현재 (일하는) .plist 에 위치한 /Library/LaunchAgents

<?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>Disabled</key>
    <false/>
    <key>EnableGlobbing</key>
    <false/>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>ram.ramon.FecharProgramas</string>
    <key>LowPriorityIO</key>
    <true/>
    <key>Program</key>
    <string>Applications/FecharProgramas.app/Contents/MacOS/FecharProgramas</string>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

내가 그것을 옮길 때. /Library/LaunchDaemons 앱이 더 이상 작동하지 않습니다.

05/10/13 10:43:24,375 FecharProgramas[90]: 3891612: (connect_and_check) Untrusted apps are not allowed to connect to or launch Window Server before login.
05/10/13 10:43:24,376 FecharProgramas[90]: kCGErrorFailure: This user is not allowed access to the window system right now.
05/10/13 10:43:24,376 FecharProgramas[90]: _RegisterApplication(), FAILED TO establish the default connection to the WindowServer, _CGSDefaultConnection() is NULL.
05/10/13 10:43:24,382 FecharProgramas[90]: kCGErrorInvalidConnection: CGSGetEventPort: Invalid connection

내 앱을 신뢰할 필요가 있습니까? 그렇다면 어떻게?


1
코드를 Applescript TEXT 파일 (예 : foo.applescript)로 저장해보십시오. chmod 명령을 사용하여 블로그 게시물을 따라갈 수 있는지 확인하여 실행 파일로 만드십시오. 60 초 동안 실행되는 반복 루프를 꺼낼 수도 있습니다. <key>StartInterval</key> <integer>60</integer> 론칭 에이전트에서
markhunte

좋은 @markhunte! 반복 루프보다 훨씬 좋습니다.
RASG

답변:


1

당신이 사용할 수있는 launchd.plist 또는 다음과 같은 프로그램을 사용하십시오. Lingon (더 쉽게 만들 수 있습니다. launchd plist).


1

내 블로그 게시물을 한번 보아라. 또 하나의 응용 프로그램이 아닌 경우 실행되지 않는 응용 프로그램

이렇게하면 텍스트 파일 (.applescript)로 저장된 스크립트를 작성하고이를 쉘 스크립트로 만드는 방법에 대한 아이디어를 얻을 수 있습니다.

직접 만드는 방법을 보여줍니다. 론칭 에이전트 #n 초마다 실행됩니다.

그런 다음 애플 스크립트 종료 또는 응용 프로그램 스크립트 수정 여러 앱에서 실행되도록 코드를 수정하는 방법을 보여주는 게시물 (당신은 이미 어떤 방식 으로든)


1

다음과 같이 plist를 저장하십시오. /Library/LaunchAgents/some_label.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>some_label</string>
  <key>ProgramArguments</key>
  <array>
    <string>osascript</string>
    <string>/path/to/script.scpt</string>
  </array>
  <key>RunAtLoad</key>
  <true/> <!-- run at login -->
  <key>KeepAlive</key>
  <true/> <!-- run the program again if it terminates -->
</dict>
</plist>

plist를로드 할 수 있습니다. launchctl load /Library/LaunchAgents/some_label.plist 로그 아웃 한 후 다시 로그인하여 man launchdman launchd.plist 자세한 내용은.

AppleScript를 다음과 같은 쉘 명령으로 대체 할 수도 있습니다.

kill $(osascript -e 'tell application "System Events" to id of processes where frontmost is false and background only is false and windows is {} and name is not "App Store" and name is not "iTunes" and name is not "FecharProgramas" and name is not "Finder" and name is not "Mail"' | tr -d ,); renice 18 $(osascript -e 'tell application "System Events" to id of (process 1 where frontmost is true)')


1
데몬은 윈도우 서버에 연결할 수 없습니다. 자세한 내용은 데몬 및 에이전트 기술 노트. 그냥 에이전트를 사용할 수 없습니까 (또는 Aqua 세션 유형의 로그인시 프로그램 실행) 할 수 있습니까?
Lri

그게 내가 현재하고있는 일이야. 문제는 사용자 전환시 2 개의 앱이 실행되는 것입니다. 내 목표는 1 (시스템 전체, 사용자 독립적)
RASG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.