【问题标题】:Shell Programming for launchd用于launchd的Shell编程
【发布时间】:2016-04-05 15:35:09
【问题描述】:

多年来,我一直在编写 shell 脚本(在本例中为 bash),并且很自在。但是我刚刚编写了一个我想通过launchd 运行的shell 脚本。现在,对于大多数 shell 脚本,我已经编写了重定向和将变量(内存驻留信息)写入文件的echoing,这是我认为必须经常发生的事情。比如:

##在日志文件中创建一行:

echo "${DATESTAMP} ${INPUT}" >> "$LOGFILE"

## 或者,在计算出一个值后将其添加到文件中

echo "${MY_EXTIP}" > "${CURRENT_IP}"

##或者,创建一个带有进程PID的文件进行监控

echo "${SSH_TUN_IP}" > "${SSH_PIDFILE}"

但是,launchd 似乎 窃取 stdout(和 stderr,但 stderr 对此并不重要),这似乎是不可能的。现在这可能是我学习 python 或 perl 来解决这个问题的好时机,但我认为人们实际上必须知道如何在 bash 中做到这一点。

TL;DR,当从 launchd 运行时,我如何将内存驻留信息获取到 bash 中的文件

非常感谢任何帮助。 c

【问题讨论】:

  • 你说的“好像偷东西”是什么意思?
  • 这篇文章 (erikslab.com/2011/02/04/logging-with-launchd) 可能会有所帮助。
  • [回复 John Hascall] 是的,已经看到该页面已经在寻找答案,它允许您获取日志文件示例(我的第一个示例)并使其成为非问题,但对第二个或第三个示例没有帮助(功能相同,查找值并将数据输入文件)
  • [回复 chepner] 来自 launchd 手册页:StandardOutPath 此可选键指定在使用 stdio(3) 时发送到 stdout 的数据应使用哪个文件。这意味着这样的事情:# echo "fred" > /tmp/myfile doesn't work
  • 它不一定意味着类似于 # echo "fred" > /tmp/myfile 不起作用,因为新的重定向重新打开 stdout 并覆盖之前的重定向由launchd 制作。你真的试过了吗?

标签: macos bash shell stdout launchd


【解决方案1】:

一种可能的解决方案:将 echo 输出发送到文件描述符,而不是将 stdout 重定向到文件,因为控制应用程序(在这种情况下启动)可能已经关闭/重定向了 stdout/stderr。

基本上可以:

exec 3> ${LOGFILE}     # Associate file descriptor 3 to LOGFILE
echo "my message" >&3  # Write to file descriptor 3
exec 3>&-              # Close file descriptor 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2012-03-01
    相关资源
    最近更新 更多