2017-03-22 9 views
1

Ich bin ein Mac OS Installer-Paket erstellen.Running Mac OS X-Anwendung als ein Benutzer nicht durch seine eigene

Dafür verwende ich eine Post-Installation-Skript-Datei, die eine Anwendung startet und lädt dann ein LaunchDaemon Plist. Hier

ist die Post-Installationsskript:

#!/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 

Das Ergebnis ist, dass es die Anwendung mit dem sudo -u $USER_NAME /usr/local/TestApp/Test.app/Contents/MacOS/Test -l Befehl startet und dann Blöcke, weil die Anwendung am Laufen hält.

Daher bleibt das Skript hängen und der LaunchDaemon wird nie geladen.

Bitte lassen Sie mich wissen, was ich in diesem Fall tun kann.

Antwort

0

Wenn Sie wollen einfach nur eine Mac-Anwendung starten (*.app) asynchron,

  • Verwendung open -a mit dem Bündel Verzeichnispfad (mit der Endung .app)
  • und übergibt all Pass-Through-Befehl -Linie Argumente nach --args (siehe man open):
sudo -u $USER_NAME open -a /usr/local/TestApp/Test.app --args -l 

Siehe Hinweis unten, um $USER_NAME, den Benutzernamen des aufrufenden Benutzers, zuverlässig zu bestimmen.

Wenn aus irgendeinem Grund, Sie müssen die ausführbare Datei in dem *.app Bündel eingebettet Ziel direkt Sie & Steuerbedienungs Bash den Befehl im Hintergrund verwenden müssen:

#!/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 

Bitte beachte, dass ich die Art und Weise verändert haben, dass die zugrunde liegenden Benutzernamen bestimmt:

  • ${HOME##*/} extrahiert die letzte Pfadkomponente aus $HOME, dem Basisverzeichnispfad des zugrunde liegenden Benutzers, der den Benutzer widerspiegelt, der das Installationsprogramm aufgerufen hat.

  • Dies ist robuster als mit who ohne Argumente, deren Ausgabe andere Benutzer enthalten kann.

(Als beiseite, who | head -1 | head -1 | awk '{print $1;}' kann who | awk '{print $1; exit} der effizienteren vereinfacht werden).

+0

Vielen Dank. Es funktionierte. –

+0

@ Akshada-Systematix: Freut mich zu hören; Gern geschehen. – mklement0

Verwandte Themen