首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何添加参数到OSX的启动plist,以管道输出到一个日志文件?

我如何添加参数到OSX的启动plist,以管道输出到一个日志文件?
EN

Stack Overflow用户
提问于 2012-11-03 16:20:18
回答 3查看 8.9K关注 0票数 5

我已经尝试了许多不同的变体,但就是不能让它工作。

我有一个plist文件:

代码语言:javascript
复制
<?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 &gt;&gt; /Users/ilium007/support/scripts/handbrake/logs/handbrake_encode.log</string>
                <!--<string>&gt;&gt;</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中一直收到“没有这样的文件”的错误。

代码语言:javascript
复制
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更改为以下内容,它将运行,但没有得到日志,因此我假设它只运行第一个参数:

代码语言:javascript
复制
<?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>&gt;&gt;</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运行的命令是:

代码语言:javascript
复制
/Users/ilium007/support/scripts/handbrake/handbrake.sh >> /Users/ilium007/support/scripts/handbrake/logs/handbrake_encode.log

日志文件中不会出现任何内容。但是,如果我从终端运行该命令,我将获得日志中的内容。任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-04 00:14:20

>>是一个shell操作符,而不是一个程序参数,而且launchd不会通过shell传递它的命令(除非您强制它,就像@Lauri的答案一样)。但launchd确实有自己的选项来重定向stdout:

代码语言:javascript
复制
<key>StandardOutPath</key>
<string>/Users/ilium007/support/scripts/handbrake/logs/handbrake_encode.log</string>

请注意,它会自动追加(等同于>>,而不是>)。您还可以使用StandardErrorPath键重定向标准错误。您不能做的一件事是使用shell (就像在~/support/scripts/handbrake/logs/handbrake_encode.log)中一样--这也是~不能模拟的一个shell特性。

票数 18
EN

Stack Overflow用户

发布于 2013-07-03 12:24:07

标准的out和error键非常有用,我重定向到第一个终端/shell,如下所示:

代码语言:javascript
复制
<key>StandardOutPath</key>
<string>/dev/ttys000</string>
<key>StandardErrorPath</key>
<string>/dev/ttys000</string>

如果您有多个终端,则可以将ttys000更改为另一个数字(ttys001..2)。您可以通过在shell中键入以下命令来查找终端id:

代码语言:javascript
复制
tty

这帮助我找出了为什么我在OS中收到控制台错误,我需要在脚本中有每个命令的完整路径和我要CD到的目录的完整路径。

例如,grep为:

代码语言:javascript
复制
/usr/bin/grep

并且由macports安装的命令也使用其他路径,例如:

代码语言:javascript
复制
/opt/local/bin/lynx

我也尝试了chown root:轮子的plist,但这似乎不是必要的,但可能不是一个坏主意,以防止有人编辑它为任何…

编辑:在我得到一些权限错误后,我将我的用户改回了普通用户,这被证明是因为脚本试图在/没有权限的情况下创建文件,还需要添加输出文件的完整路径,这很奇怪,因为它在前一天工作。

票数 6
EN

Stack Overflow用户

发布于 2012-11-03 23:27:57

重定向运算符不能用作参数。您可以为管道创建另一个脚本,也可以使用bash -c

代码语言:javascript
复制
<string>bash</string>
<string>-c</string>
<string>bash ~/Desktop/test.sh >> ~/Desktop/test</string>
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13207365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档