【问题标题】:OSX why my launchagent process starting as root instead of current userOSX为什么我的launchagent进程以root而不是当前用户启动
【发布时间】:2015-09-09 04:44:39
【问题描述】:

我想以当前用户身份运行该进程。但它是以root身份开始的。如何以当前用户身份启动进程?

此脚本在 OSX 包的 postinstall 中运行。使用 pkgbuild 打包。

与我在 Xcode 中构建命令行工具的方式有什么关系吗?

NAME="myapp"
SCPROXY_INSTALLATION_DIR="/opt/local/bin"

# Script identifier (same as package identifier).
IDENTIFIER="com.mycomp.myapp"

LAUNCH_AGENT_PLIST="/Library/LaunchAgents/$IDENTIFIER.plist"

# Write LaunchDaemon plist file.
echo '<?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>'$IDENTIFIER'</string>
<key>ProgramArguments</key>
<array>
<string>'$SCPROXY_INSTALLATION_DIR/$NAME'</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/var/log/scproxy.log</string>
<key>StandardErrorPath</key>
<string>/var/log/scproxy.log</string>
<key>Debug</key>
<true/>

</dict>
</plist>' > "$LAUNCH_AGENT_PLIST"

/bin/launchctl unload  $LAUNCH_AGENT_PLIST
/bin/launchctl load  $LAUNCH_AGENT_PLIST

#exit 0
# Check LaunchDaemon is loaded.
STATUS=`/bin/launchctl list | /usr/bin/grep $IDENTIFIER | /usr/bin/awk '{print $3}'`

if [ "$STATUS" = "$IDENTIFIER" ]
then
echo "Success: LaunchAgent loaded."
exit 0
else
echo "Error: LaunchAgent not loaded."
exit 1
fi

【问题讨论】:

    标签: macos launch-agent


    【解决方案1】:

    您正在将启动代理 plist 添加到系统级启动代理目录,它将仅以 root/admin 权限启动应用程序。您需要将启动代理放在 USER Level Launch Agents 目录中,即 USER_HOME/Library/LaunchAgents/ ,例如:/Users/mani/Library/LaunchAgents/

    另外,如果您要以当前用户身份运行应用程序,那么日志路径无效,因为当前用户没有权限在 /var/log 中写入日志。所以你也需要更改日志目录。

    还以当前用户身份从 launchctl 加载和卸载,而不是以 admin/root 用户身份加载和卸载。

    https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html

    【讨论】:

    • 从 pkg 安装时,我在 postinstall 中运行此脚本。我将 myapp 保存在 $HOME/Library/LaunchAgents/ 中,但它仍然以 root 身份运行。
    • 你需要保存plist文件$HOME/Library/LaunchAgents,app可以保存在/Applications。然后您可以通过launchctl load ~/Library/LaunchAgents/${PLISTFILE} 以当前用户身份加载/卸载。
    【解决方案2】:

    那是因为您将 *plist 放在了 LaunhDaemons 中。 LaunchDeamon 中的所有 *.plist 都将在 ROOT 中运行。 您需要将 *.plist 放入 LaunchAgent。它可以是 /Library/LaunchAgents 或 System/Library/LaunchAgents

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 2014-10-12
      • 2020-09-22
      • 2011-11-20
      • 2017-09-25
      • 2015-10-11
      • 1970-01-01
      相关资源
      最近更新 更多