1

macOS インストーラー パッケージを作成しています。

このために、アプリケーションを起動し、LaunchDaemon plist をロードするポスト インストール スクリプト ファイルを使用しています。

インストール後のスクリプトは次のとおりです。

#!/bin/bash

cd /usr/local/TestApp
USER_NAME=$(who | head -1 | head -1 | awk '{print $1;}')
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コマンドでアプリケーションを開始し、アプリケーションが実行し続けるため、ブロックされます。

そのため、スクリプトがスタックし、LaunchDaemon が読み込まれません。

この場合、どうすればよいか教えてください。

4

1 に答える 1

0

*.app単純に Mac アプリケーション ( )を非同期で起動したい場合は、

  • バンドルディレクトリ パス (末尾が)で使用open -aします。.app
  • その後、パススルー コマンドライン引数を渡します--args(「 」を参照man open)。
sudo -u $USER_NAME open -a /usr/local/TestApp/Test.app --args -l

$USER_NAME呼び出し元のユーザーのユーザー名を確実に決定する方法については、下部の注を参照してください。

何らかの理由で、*.appバンドルに埋め込まれた実行可能ファイルを直接ターゲットにする必要がある場合は、Bash の&制御演算子を使用してコマンドをバックグラウンドで実行する必要があります。

#!/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ユーザーを含めることができる引数なしで使用するよりも堅牢です。

(余談です who | head -1 | head -1 | awk '{print $1;}'が、より効率的なものに単純化できますwho | awk '{print $1; exit})。

于 2017-03-23T10:45:59.810 に答える