4

我在 ~/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>

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

#! /bin/bash 

echo "hello world from test_launchd.sh" >> /Users/luke/dev/data_yogapo/log/development.log

当我手动运行 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

我已经尝试过使用和不使用 RunAtLoad 键。我已经在 SO 以及互联网上的其他地方查看了其他答案。我已经按照教程进行操作,但根本没有发生任何事情。非常感谢任何帮助 - 谢谢!

4

2 回答 2

7

您要求launchd运行名为

". /Users/luke/dev/data_yogapo/script/test_launchd.sh"

它将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/script/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>

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

<key>ProgramArguments</key>
<string>/Users/luke/dev/data_yogapo/script/test_launchd.sh arg1 arg2 arg3</string>
于 2012-05-23T01:49:57.963 回答
0

解决方案我发现最简单的方法是下载一个应用程序来操作这些文件:

https://itunes.apple.com/us/app/launchd-task-scheduler/id620249105

于 2013-04-17T15:26:14.597 回答