我已尝试过很多不同的变体,但却无法让它发挥作用。
我有一个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.ilium007.handbrake</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/ilium007/support/scripts/handbrake/handbrake.sh >> /Users/ilium007/support/scripts/handbrake/logs/handbrake_encode.log</string>
<!--<string>>></string>-->
<!--<string>/Users/ilium007/support/scripts/handbrake/logs/handbrake_encode.log</string>-->
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>60</integer>
</dict>
</plist>
请注意那里的评论。
我想将handbrake.sh脚本的输出管道传输到日志文件并尝试这样做但在OSX上的system.log中不断出现“无此文件”错误。
Nov 3 18:03:54 macmini com.ilium007.handbrake[15348]: /bin/bash: /Users/ilium007/support/scripts/handbrake/handbrake.sh >> /Users/ilium007/support/scripts/handbrake/logs/handbrake_encode.log: No such file or directory Nov 3 18:03:54 macmini com.apple.launchd.peruser.501[162] (com.ilium007.handbrake[15348]): Exited with code: 127
如果我将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.ilium007.handbrake</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/ilium007/support/scripts/handbrake/handbrake.sh</string>
<string>>></string>
<string>/Users/ilium007/support/scripts/handbrake/logs/handbrake_encode.log</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>60</integer>
</dict>
</plist>
我想通过launchd运行的命令是:
/Users/ilium007/support/scripts/handbrake/handbrake.sh >> /Users/ilium007/support/scripts/handbrake/logs/handbrake_encode.log
日志文件中没有任何内容。但是如果我从终端运行该命令,我会在日志中获取内容。任何帮助将不胜感激。
答案 0 :(得分:16)
>>
是一个shell运算符,而不是程序参数,并且launchd不会通过shell传递它的命令(除非你强制它,如在@Lauri的回答中)。但是launchd确实有自己的选项来重定向stdout:
<key>StandardOutPath</key>
<string>/Users/ilium007/support/scripts/handbrake/logs/handbrake_encode.log</string>
请注意,它会自动附加(相当于>>
,而不是>
)。您还可以使用StandardErrorPath
键重定向stderr。你不能做的一件事就是使用~
(如〜/ support / scripts / handbrake / logs / handbrake_encode.log) - 这也是launchd不能模仿的shell特性。
答案 1 :(得分:5)
标准输出和错误键非常有用,我将我的重定向到第一个终端/ shell,如下所示:
<key>StandardOutPath</key>
<string>/dev/ttys000</string>
<key>StandardErrorPath</key>
<string>/dev/ttys000</string>
如果您有多个终端,可以将ttys000更改为另一个号码(ttys001..2)。您可以通过在shell中输入来找到终端ID:
tty
这帮助我找出了为什么我在OS X中遇到控制台错误,我需要为每个命令提供完整路径,并为脚本中的CD提供完整路径。
例如grep是:
/usr/bin/grep
和macports安装的命令也使用其他路径,如:
/opt/local/bin/lynx
我也尝试过chown root:滚动plist,但这似乎没有必要,但可能不是一个坏主意,以防止有人编辑它...
编辑:在我获得一些权限错误之后将我的用户改回普通用户,原因是因为脚本试图在/无权限的情况下创建文件,需要添加完整路径到输出文件,这很奇怪,因为它前一天工作。
答案 2 :(得分:4)
重定向运算符不能用作参数。您可以为管道创建另一个脚本,也可以使用bash -c
。
<string>bash</string>
<string>-c</string>
<string>bash ~/Desktop/test.sh >> ~/Desktop/test</string>