실행 된 명령을 루트로 실행하는 방법


32

.plist 파일로 다음 launchctl 명령이 있습니다. 로드되고 하루에 한 번 실행되도록 설정되었지만 루트로 실행해야하며 이것을 확인하는 방법을 잘 모르겠습니다.

또한이 크론 작업은 기본적으로 CD를 디렉토리에 넣고 명령을 실행합니다. 나는 launchd가 명령을 실행할 디렉토리를 지정하는 더 좋은 방법을 가지고 있다고 확신합니다.

루트로 실행되고 이것을 작성하는 더 좋은 방법이 있는지 어떻게 알 수 있습니까?

<?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>dev.project.frontpage.feedparser</string>
    <key>ProgramArguments</key>
    <array>
        <string>cd</string>
        <string>/Users/eman/src/project/trunk/includes/;</string>
        <string>./feed-parser.php</string>
        <string>-c</string>
        <string>./feed-parser-config.xml</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>

답변:


46

어떤 폴더에 .plist저장되어 있습니까?

launchd데몬 ( /Library/LaunchDaemons또는 /System/Library/LaunchDaemons)을 루트로 실행하고 사용자의 로그인 여부에 관계없이 실행합니다. 사용자가 해당 사용자로 로그인하면 시작 에이전트 ( /Library/LaunchAgents/또는 ~/Library/LaunchAgents/)가 실행됩니다. setuid를 사용하여 데몬에서 스크립트를 실행하는 사용자를 변경할 수 없습니다.

당신이 그것을 추가 할 것이기 때문에 /Library/LaunchDaemons당신이 있는지 확인하는 것이 좋습니다 당신이에로드 launchd관리자 권한 (예. sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist)

man launchd자세한 내용을 확인 하십시오.


고맙습니다. 이것은 근본적인 문제에 대답하는 한 내가 찾던 것입니다. 스크립트는 / Library / LaunchDaemons에 있으므로 이미 루트로 실행 중입니다.
Emmanuel Mwangi

초보자 질문 : launchctl데몬을 설치하기 위해 실행 중 입니까? plist 파일을 해당 경로에 복사하는 것으로 충분하지 않습니까?
Claudix

@Claudix : 맞습니다. 실행 된 설정을 제자리에 복사하는 것만으로는 충분하지 않습니다. 여전히 "켜져"있어야합니다 (시작로드)
Chealion

4

시작된 편집기 중 하나를 사용해 보셨습니까?

루트로 실행되도록하려면 launchd가 루트로 프로그램을 실행한다고 확신합니다. chmod를 사용하여 스크립트 소유권을 루트에 부여하려고 생각한 적이 있습니까? 이런 식으로 루트로 실행하지 않으면 실행되지 않습니다. 그런 다음 실행되는지 확인해야합니다.

sudo chown root:admin script_to_run_by_launchd

Lingon을 사용하여이 스크립트를 작성했습니다. 그리고 Leopard에서 잘 작동한다는 것을 알 수 있습니다.
Emmanuel Mwangi

3

LaunchAgents의 속성 목록도 작동하지만 sudo를 사용하여 에이전트와 데몬을 모두로드해야합니다.

sudo chown root /Library/LaunchAgents/test.plist
sudo launchctl load /Library/LaunchAgents/test.plist

plist에 비활성화 된 키가없는 경우 다음에 로그인 할 때로드되거나 기본적으로 다시 시작되므로 -w필요하지 않습니다.

기술 노트 TN2083 : 데몬 및 에이전트 :

데몬은 전체 시스템의 일부로 백그라운드에서 실행되는 프로그램입니다 (즉, 특정 사용자와 연결되어 있지 않습니다). 데몬은 GUI를 표시 할 수 없습니다. 보다 구체적으로, 윈도우 서버에 연결할 수 없습니다.

[...]

에이전트는 특정 사용자 대신 백그라운드에서 실행되는 프로세스입니다. 에이전트는 데몬이 사용자의 홈 디렉토리에 안정적으로 액세스하거나 창 서버에 연결하는 등 데몬이 할 수없는 작업을 수행 할 수 있기 때문에 유용합니다.


3

Launch Daemon에 루트 권한이 있는 런치 에이전트 를 구체적으로 실행하려는 Google 직원 의 경우 다음을 수행 할 수 있습니다.

  • 에 LaunchAgent 생성 ~/Library/LaunchAgents
  • plist sudoProgramArguments속성 을 통해 응용 프로그램을 실행하십시오.
  • NOPASSWD응용 프로그램 옵션 설정/etc/resolvers.d

자세한 내용은 this and this answer를 참조하십시오 .


2

LaunchControl 은 요세미티에서 고통스럽지 않았습니다 . 서비스를 생성하거나 편집하는 데 도움이되는 멋진 끌어서 놓기 GUI가 있습니다. 내가 모르는 모든 서비스가 실행되는 것을 보는 것은 놀라운 일이었습니다.

단계

  1. LaunchControl 시작
  2. GlobalDeamons로 왼쪽 상단을 변경하고 관리자 비밀번호를 입력하십시오.
  3. 파일-> 신규
  4. 레이블 아래에 고유 한 이름을 지정하십시오. 협약은 "com.company.appname"입니다.
  5. 프로그램에서 실행하려면 Unix Shell 스크립트 또는 WITHOUT 인수없이 원하는 명령을 사용하십시오.
  6. 앱에 인수가 필요한 경우 드롭 다운 필드를 "Default argv"에서 "Custom argv"로 변경하십시오.
    1. 이제 실제 명령 행에서 실행할 때 일반적인 인수를 제공하십시오.
  7. 로드시 실행은 선택 사항입니다.
  8. 오른쪽에서 StartInterval을 끌어다 놓고 원하는 간격을 설정하십시오. 도움말 메뉴의 FAQ는 매우 좋습니다.

질문자가 문제를 해결하기 위해 취할 수있는 단계를 포함하도록 게시물을 편집 할 수 있습니까?
Cfinley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.