홈 폴더에 저장된 로그인시 bash 스크립트를 실행 하시겠습니까?


19

LaunchAgent plist를로드하려고 launchctl하면 홈 디렉토리에서 스크립트를 실행하는 방법을 찾을 수 없습니다.

내 코드는 다음과 같습니다

<?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>ProgramArguments</key>
    <array>
        <string>bash</string>
        <string>~/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

나는 bash를 사용하거나 사용하지 않고 모두 시도 ~했습니다 $HOME. 또한 bash -c작동하지 않고 사용해 보았습니다 .

오류 코드는 다음과 같습니다

`com.tyilo.test: bash: ~/script.sh: No such file or directory`

전체 경로 (예 : /Users/name/script.sh)를 입력 해보십시오 (또한 스크립트를 실행 가능하고 첫 번째 행 #! / bin / bash로 작성하여 직접 실행하십시오)
user151019

여러 계정과 컴퓨터에서 사용되므로 전체 경로를 사용할 수 없습니다.
Tyilo

1
여러 계정을 사용하려면 각 사용자의 $ HOME에 여러 복사본을 만드는 대신 / usr / local / bin /에 저장해야합니다. 이 스크립트로 무엇을 성취하려고하는지 아는 것이 도움이 될 것입니다. LoginHook, IMO의 직업처럼 들립니다.
TJ Luoma

답변:


14

EnableGlobbing다음에 대한 물결표 및 와일드 카드 확장이 가능합니다 ProgramArguments.

<key>EnableGlobbing</key>
<true/>
<key>ProgramArguments</key>
<array>
    <string>say</string>
    <string>~/*</string>
</array>

Program또는 WatchPaths에 영향을 미치지 않지만 물결표 확장은 WatchPaths기본적으로 작동합니다 .


이것이 더 좋은 방법입니다. LaunchAgent plist에서 키에 대한 문서를 볼 수있는 곳이 있습니까?
Tyilo

man launchd.plist. 또는 이 블로그 게시물 또는 내 웹 사이트를 참조하십시오 .
Lri

1
이것은 나에게도 도움이되었습니다. 10.7, 10.8 및 10.9의 Mac OS X 버전에서 시도했습니다.
Dj S

6
참고 :이 기능은 Yosemite ( Mac OS X 10.10+) 에서 제거되었습니다 .
alex grey

10.9.5도 아닌 것 같습니다
ocodo

18

OS X Yosemite 10.10에서는 EnableGlobbing 이 작동하지 않습니다 . 더 이상 사용되지 않습니다 ( ref ).

당신은 로그에서 볼 수있는 The EnableGlobbing key is no longer respected. Please remove it.(에서 /var/log/system.log)

문제는 launchdcwd (현재 작업 디렉토리)가 /이므로 ./일부 사람들이 말한 것처럼 사용할 수 없습니다 .

가정에서 스크립트를 실행하려면 간단한 방법을 사용하는 것 (bash|zsh|sh) -c입니다. 선택권. 이런 식으로 물결표 ~또는 $HOME변수 를 사용할 수 있습니다 .

<?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>org.your.stuff</string>
    <key>ProgramArguments</key>
    <array>
      <!-- here is the important thing -->
      <string>zsh</string>
      <string>-c</string>
      <string>~/you/script/in/your/home</string>
    </array>

    <!-- code below is just for the example -->
    <!-- Keep running... -->
    <key>KeepAlive</key>
    <true />
    <!-- ...every day. In sec, 60*60*24 = every day -->
    <key>ThrottleInterval</key>
    <integer>86400</integer>
  </dict>
</plist>

2
나는 당신이 물결표를 사용할 수 있다고 생각하지 않습니다 sh; Bash sh가로 포함되면 POSIX 호환 모드에서 실행되어 많은 Bash 확장이 비활성화됩니다.
tripleee

~/고 블링하므로 지원되지 않습니다. ./데몬이 사용자 홈 라이브러리에 저장되어있는 한 대신 사용할 수 있습니다 . ( ~/Library/LaunchAgents)
브루노

9

내가 가장 신뢰할 수있는 sh것은 HOME환경 변수 와 환경 변수를 사용하는 것입니다.

<?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>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>-c</string>
        <string>"$HOME/script.sh"</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

참고 : 따옴표가 필요합니다.


2

스크립트가 사용자의 홈 디렉토리에서 실행되어야하는 이유를 아는 것이 도움이 될 것입니다. 스크립트에 대한 사용자의 짧은 이름이 필요한 경우 다음과 같이 변수에 지정하여 얻을 수 있습니다.

user=`whoami`

그런 다음 $user스크립트에서 사용 하십시오.

스크립트를 홈 디렉토리가 아닌 다른 곳에두면 같은 컴퓨터의 다른 사용자가 액세스 할 수 있습니다. 공유 디렉토리를 사용하거나 스크립트를 / Library / Scripts /에 넣을 수 있습니다.

시작된 plist의 전체 경로를 사용해야합니다. 또한, 실행 된 plist <string>bash</string>에서 스크립트에 shebang이 있어야하고 실행 가능 해야하므로 지정할 필요가 없습니다 .


bash실제로 실행할 명령으로 지정 하면 실질적인 손해가 발생하지 않고 대체됩니다. Shebang이 없거나 스크립트 실행 파일 (o = rwx)을 잊어 버린 경우, bash는 여전히 스크립트를 호출 / 실행합니다.
Jason Salaz

1
$ USER 또는 $ LOGNAME과 같은 사용자 이름에 대한 변수가 이미 있어야합니다. 또한 공유 Unix 스크립트의 일반적인 위치는 / usr / local / bin /입니다 (다른 곳에 넣을 수는 없지만 / usr / local / bin /은 이미 $ PATH에있을 것입니다).
TJ Luoma

whoami를 사용하는 것은 $ USER 또는 $ LOGNAME과 동일한 정보를 얻는 또 다른 방법입니다. 질문자를 추측하고 싶지 않기 때문에 위의 위치를 ​​제안했습니다. 또한 실행 된 plist를 작동 시키려면 스크립트를 실제로 CLI에서 실행할 수 있어야합니다.
afragen

1

실행 가능합니까?

chmod 700 ~/script.sh

터미널에서. 또한 $ HOME 또는 ~를 사용하지 않고 파일의 실제 경로를 사용합니다.

<?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.tyilo.test</string>
    <key>ProgramArguments</key>
    <array>
        <string>/path/to/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

downvote의 이유는 무엇입니까?
TJ Luoma

1

스크립트가 사용자 에이전트 (따라서 홈 폴더의 라이브러리에 위치) 인 경우 launchd의 현재 작업 디렉토리는 홈 폴더입니다. UNIX는 경로에 마침표가있는 홈 디렉토리를 나타냅니다.

따라서 기본적으로 ./script.sh대신 사용하십시오 ~/script.sh. ;-)


3
아니요, launchd의 작업 디렉토리는 실제로 /'~'가 아닙니다.
Tyilo

@Tyilo 무슨 말인지 잘 모르겠습니다. "시작된 작업 디렉토리가 루트입니다 (모든 경우에 심지어 사용자 모드에서도)"를 의미하는 경우 참조를 제공하십시오. "출시 된 물결표 대신 슬래시 사용"을 의미하는 경우 내 게시물을 다시 읽습니다. 그건 그렇고, 나는 예약 된 여러 스크립트를 가지고 있으며 내가 설명한 동작을 따릅니다. ;-)
Constantino Tsarouhas 2016 년

1
@RandyMarch 나는에 발사 에이전트를 만든 ~/Library/LaunchAgents인수에 : sh, -c, echo $HOME > /Users/Tyilo/launchd_home.txt. /Users/Tyilo/launchd_home.txt포함 된 파일을 실행했을 때는 /그렇지 않습니다 /Users/Tyilo.
Tyilo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.