Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何向OSX launchd plist添加参数以将输出管道化到日志文件?_Macos_Bash_Scripting_Launchd - Fatal编程技术网

Macos 如何向OSX launchd plist添加参数以将输出管道化到日志文件?

Macos 如何向OSX launchd plist添加参数以将输出管道化到日志文件?,macos,bash,scripting,launchd,Macos,Bash,Scripting,Launchd,我已经尝试了很多不同的变化,但就是不能让它的工作 我有一个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&g

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

我有一个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 &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>
如果我将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>&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>

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

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

<string>bash</string>
<string>-c</string>
<string>bash ~/Desktop/test.sh >> ~/Desktop/test</string>
bash
-c
bash~/Desktop/test.sh>~/Desktop/test

是一个shell操作符,而不是程序参数,launchd不会通过shell传递其命令(除非您强制它,如@Lauri的回答中所示)。但是launchd有自己的重定向stdout的选项:

<key>StandardOutPath</key>
<string>/Users/ilium007/support/scripts/handbrake/logs/handbrake_encode.log</string>
StandardOutPath
/用户/ilium007/support/scripts/handbrake/logs/handbrake_encode.log

请注意,它会自动附加(相当于
>
,而不是
>
)。您还可以使用
StandardErrorPath
键重定向stderr。有一件事你不能使用
~
(如~/support/scripts/handbrake/logs/handbrake\u encode.log)——这也是launchd不模拟的shell功能。

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

<key>StandardOutPath</key>
<string>/dev/ttys000</string>
<key>StandardErrorPath</key>
<string>/dev/ttys000</string>
这有助于我找出为什么在OSX中会出现控制台错误,我需要为每个命令提供完整路径,并为脚本中的目录提供完整路径

例如,grep是:

/usr/bin/grep
macports安装的命令也使用其他路径,如:

/opt/local/bin/lynx
我还尝试了chown root:wheel the plist,但这似乎不是必要的,但可能不是一个坏主意,可以阻止某人将其编辑为任何内容


编辑:在我收到一些权限错误后,将我的更改为普通用户,这些错误是因为脚本试图在/未经权限的情况下创建文件,还需要向输出文件添加完整路径,这在前一天工作时很奇怪。

属于@lanzz oh。。道歉。我不知道有一个不同的网站,因为我在这里阅读了其他启动问题。我如何移动它?非常感谢@gordon Davidson,也感谢stderr和stdout的建议。这就是我最后做这件事的方式,现在工作得很好。
tty
/usr/bin/grep
/opt/local/bin/lynx