运行 mac os x 作为用户的应用程序不会自行停止

Running mac os x application as a user does not stop by its own

我正在创建 macOS 安装程序包。

为此,我使用 post-install 脚本文件来启动应用程序,然后加载 LaunchDaemon plist。

这是 post 安装脚本:

#!/bin/bash

cd /usr/local/TestApp
USER_NAME=$(who | head -1 | head -1 | awk '{print ;}')
sudo -u $USER_NAME /usr/local/TestApp/Test.app/Contents/MacOS/Test -l

sudo launchctl load /Library/LaunchDaemons/com.testapp.plist

结果是它用sudo -u $USER_NAME /usr/local/TestApp/Test.app/Contents/MacOS/Test -l命令启动应用,然后blocks,因为应用保持运行.

因此,脚本卡住了,LaunchDaemon 永远不会加载。

请告诉我万一我能做什么。

如果您只想启动 Mac 应用程序 (*.app) 异步,

  • open -a 捆绑包 目录路径一起使用(以 .app 结尾)
  • 并在 --args 之后传递任何直通命令行参数(参见 man open):
sudo -u $USER_NAME open -a /usr/local/TestApp/Test.app --args -l

请参阅底部注释,重新可靠地确定 $USER_NAME,调用用户的用户名。

如果出于某种原因,您确实需要将 *.app 中嵌入的可执行文件作为目标直接 ,您必须使用 Bash 的 & control operator to 运行 background中的命令:

#!/bin/bash

# Get the underlying username (see comments below).
userName="${HOME##*/}"

# Launch the app in the background, using control operator `&`
# which prevents the command from blocking.
# (Given that the installer runs the script as the root user,
# `sudo` is only needed here for impersonation.)
sudo -u "$userName" /usr/local/TestApp/Test.app/Contents/MacOS/Test -l &

# Load the daemon.
# (Given that the installer runs the script as the root user,
# `sudo` is not needed here.)
launchctl load /Library/LaunchDaemons/com.testapp.plist

请注意,我已经更改了确定基础用户名的方式:

  • ${HOME##*/}$HOME 中提取最后一个路径组件,底层用户的主目录路径,它反映了调用安装程序的用户。

  • 这比使用不带参数的 who 更可靠,后者的输出可以包括 other 用户。

(顺便说一句,who | head -1 | head -1 | awk '{print ;}'可以简化为更高效的who | awk '{print ; exit})。