运行 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}
)。
我正在创建 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}
)。