【问题标题】:Mac OSX LaunchDaemon on Startup, Shell Script with SSHMacos 在启动时启动守护进程,使用 SSH 的 Shell 脚本
【发布时间】:2013-08-21 18:16:05
【问题描述】:

我希望有人可以帮助我解决这个问题。我一整天都在努力……

我希望 LaunchDaemon 在启动时执行 shell 脚本。这是我的 plist 文件,位于 /Library/LaunchDaemons/com.mhi.backup.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.mhi.backup</string>
  <key>UserName</key>
  <string>Joel</string>
  <key>GroupName</key>
  <string>Admin</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/mhi_websites_backup.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

当我从终端加载它时它正确执行(launchctl load /Library/LaunchDaemons/com.mhi.backup.plist),但不是在启动时。

这是我的脚本,供参考:

#!/bin/bash
sleep 15 #delay script to ensure time for network connection
ssh user@hostname << HERE
  mysqldump -u <user_name> -pPASSWORD --all-databases | lzma > alldatabases.sql.lzma 
  tar cfa backup-`date '+M%mD%dY%y'`.tar.lzma webapps alldatabases.sql.lzma 
  exit
HERE
scp user@hostname:backup-`date '+M%mD%dY%y'`.tar.lzma /Users/Joel/Desktop

有人可以帮忙吗?

非常感谢,

JG

【问题讨论】:

  • 对每个环境执行 { set ; export ; } | sort &gt; cmdLineEnv{ set ; export ; } | sort&gt; startupEnv,然后 diff *Env ?祝你好运。
  • 看起来和我的 plist 相似,但我把它放在 LaunchAgents 而不是 LaunchDaemons 中。不知道有什么区别。
  • @shellter 唯一的区别在于 PIPESTATUS。在startupEnv中,PIPESTATUS=([0]="0" [1]="0");在 cmdLineEnv 中,PIPESTATUS=([0]="0")。我什至不知道这意味着什么......
  • @JustinMeiners 当我将 plist 放入 LaunchAgents 时,脚本运行。但是,它只在登录时运行,而不是在启动时运行。我希望脚本在启动时执行,无论用户是否登录。
  • 这很难在没有看到实际错误的情况下进行调试。指定 StandardErrorPathStandardOutPath。我确信解决方案就在那里。

标签: macos shell launchd launch-daemon


【解决方案1】:

您看到了什么错误?我希望您在这里可能遇到PATH 问题。 mysqldump 在哪里?如果它在/usr/local/bin 中,那么您可能想要明确指出,或者在/etc/launchd.conf 中设置默认路径。

【讨论】:

  • mysql 转储正在远程服务器上执行。如果环境是 root,我怀疑这个问题可能与我的用户的 ssh 密钥没有被使用有关,但我不确定测试这个假设的确切语法。
  • 我明白你的意思。 LaunchDaemons 运行在一个有点滑稽的状态,不绑定到 GUI,但它们是 root 并且应该能够读取 ~root/.ssh 你在控制台中有任何错误吗?
【解决方案2】:

plist 是否由 root 拥有?如果/Library/Launch{Agents,Daemons}/ 中的plist 不属于root 用户,则可以在没有sudo 的情况下使用launchctl 加载,但在登录时不会加载。

您也可以尝试将 plist 移动到 /Library/LaunchAgents/ 并添加 LimitLoadToSessionType 键:

<key>LimitLoadToSessionType</key>
<array>
  <string>LoginWindow</string>
  <string>Aqua</string>
</array>

请参阅Daemons and Agents 技术说明。

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 2021-02-03
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多