Macos 如何向OSX launchd plist添加参数以将输出管道化到日志文件?
我已经尝试了很多不同的变化,但就是不能让它的工作 我有一个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
<?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>
如果我将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>
日志文件中不会出现任何内容。但如果我从终端运行该命令,我会在日志中获取内容。任何帮助都将不胜感激。重定向运算符不能用作参数。您可以为管道创建另一个脚本,也可以使用
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