"你好世界"推出了plist不工作

Luk*_*ths 4 launchd plist

我在〜/ Library/LaunchAgents中有以下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>com.yogapo.test_launchd</string>

    <key>Program</key>
    <string>. /Users/luke/dev/data_yogapo/script/test_launchd.sh</string>

    <key>StartInterval</key>
    <integer>10</integer>

    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

test_launchd.sh文件包含以下内容:

#! /bin/bash 

echo "hello world from test_launchd.sh" >> /Users/luke/dev/data_yogapo/log/development.log
Run Code Online (Sandbox Code Playgroud)

当我手动运行test_launchd.sh时
. /Users/luke/dev/data_yogapo/script/test_launchd.sh ,结果与预期一致:该行出现在结尾处development.log

但是当我加载这个plist文件时,没有任何反应:

$ cd ~/Library/LaunchAgents
$ launchctl load com.yogapo.test_launchd.plist
$ launchctl list | grep yogapo
  -       1       com.yogapo.test_launchd
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用和不使用RunAtLoad键.我在这里以及互联网上的其他地方看过其他答案.我已经按照教程,并没有发生任何事情.任何帮助非常感谢 - 谢谢!

Dav*_*ski 7

你要求launchd运行名为的程序

". /Users/luke/dev/data_yogapo/script/test_launchd.sh"
Run Code Online (Sandbox Code Playgroud)

它将把Program键的整个值作为第一个参数execvp(有关详细信息,请参阅man execvp(3))

如果你要检查system日志,你会看到类似的东西:

5月22日21:17:38凹陷com.apple.launchd.peruser.501 [202](com.yogapo.test_launchd [32986]):posix_spawn("./ Users/luke/dev/data_yogapo/scripts/test_launchd.sh" ,...):没有这样的文件或目录5月22日21:17:38凹陷com.apple.launchd.peruser.501 [202](com.yogapo.test_launchd [32986]):退出退出代码:1

launchd不是一个壳.但是,它可以解释hash-bang字符序列以识别用于解释脚本的程序.因此,只需将脚本指定为要运行的程序:

<key>Program</key>
<string>/Users/luke/dev/data_yogapo/script/test_launchd.sh</string>
Run Code Online (Sandbox Code Playgroud)

注意:如果需要将参数传递给脚本,请使用ProgramArguments密钥并将整个命令行放在那里.例如:

<key>ProgramArguments</key>
<string>/Users/luke/dev/data_yogapo/script/test_launchd.sh arg1 arg2 arg3</string>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果使用ProgramArguments键,则不使用Program键 - 只需将程序名称作为数组中的第一个字符串即可. (3认同)