2017-01-07 6 views
1

Ich habe diesen Code:Datei im Hintergrund von LaunchAgent Plist ausführen?

<?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>updater.Keychain.plist.sh</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>bash</string> 
     <string>-c</string> 
     <string>/Users/qwe/Music/meta.sh</string> 
     <string>/Users/qwe/Music/seta.sh</string> 

    </array> 
    <key>RunAtLoad</key> 
    <true/> 
</dict> 
</plist> 

Die Sache ist die, dass „meta.sh“ ist eine nie endende Skript, das alle 5 Sekunden überprüfen, ob etwas Bestimmtes geschieht, und deshalb „seta.sh“ wird nie laufen wird . Wenn Sie dies im Terminal tun, kann ich einfach das & Symbol verwenden, um die Dateien im Hintergrund laufen zu lassen, aber ich habe mit dem &amp; am Ende der Dateinamen versucht, aber es hat nicht wirklich funktioniert. Kann mir bitte jemand helfen? Vielen Dank!!

+3

'seta.sh' wird nicht ausgeführt, nicht weil' meta.sh' niemals beendet wird, sondern weil es nur ein anderes Argument für 'bash' ist, das speziell dazu verwendet wird, den Wert von' $ 0' aus 'meta.sh' zu setzen . – chepner

+0

Was würden Sie tun, wenn meta.sh ein nie endender Befehl wäre? Aber Seta war immer noch eine Datei –

Antwort

0

chepners Kommentar ist richtig über das unmittelbare Problem: Sie übergeben die Skriptnamen, um falsch zu bash. Nach der -c Option erwartet bash ein einzelnes Argument, das den auszuführenden Befehl enthält (optional gefolgt von Argumenten, die an ihn übergeben werden, beginnend mit $0). Wenn Sie mehrere Befehle ausführen möchten, müssen Sie sie zu einem einzigen zusammengesetzten Befehl kombinieren, z. B. /Users/qwe/Music/meta.sh & /Users/qwe/Music/seta.sh.

Aber ich denke, Sie verwenden auch launchd falsch. Launchd soll Prozesse starten und dann überwachen. Dies erfordert, dass sie im Vordergrund bleiben. Dinge, die sich hinter dem Launchd befinden, tendieren dazu, es zu verwirren, was zu seltsamen Problemen führt. Betrachten Sie zum Beispiel die oben angegebene Befehlszeichenfolge. Es führt meta.sh im Hintergrund und seta.sh im Vordergrund aus. Sie haben gesagt, dass meta.sh ein langwieriger Prozess ist, aber ich nehme an, dass seta.sh nur seine Arbeit erledigt und beendet? Wenn dies der Fall ist, wird launchd sehen, dass seta.sh (der Vordergrundprozess) beendet wurde, und bedenke, dass irgendwelche Subprozesse (meta.sh) übrig gebliebene Waisen sind und sie "aufräumen" sollten, d. H. Sie töten. Hoppla, meta.sh läuft nicht mehr lange.

Wenn Sie wirklich möchten, dass sowohl meta.sh als auch seta.sh gestartet werden, sollten Sie zwei separate lawdd-Elemente (d. H. Zwei .plist-Dateien) für sie erstellen.

Wenn Sie brauchen, um sie zusammen aus irgendeinem Grund laufen, wahrscheinlich der beste Weg ist, um im Wesentlichen ein kleines Skript zu erstellen, die beide von ihnen läuft und wartet dann sowohl für zu verlassen, und übergeben das „Skript“, wie bash der Parameter für die Option -c. Beachten Sie, dass dies bedeutet, das gesamte „script“ hat in einem einzigen string im ProgramArguments Array sein:

<key>ProgramArguments</key> 
<array> 
    <string>bash</string> 
    <string>-c</string> 
    <string>/Users/qwe/Music/meta.sh &amp; /Users/qwe/Music/seta.sh; wait</string> 
</array> 

Eine andere Möglichkeit wäre, die AbandonProcessGroup Schlüssel zum .plist hinzuzufügen, und nicht über die „Skript“ warten für Hintergrundprozess zu beenden:

<key>ProgramArguments</key> 
<array> 
    <string>bash</string> 
    <string>-c</string> 
    <string>/Users/qwe/Music/meta.sh &amp; /Users/qwe/Music/seta.sh</string> 
</array> 
<key>AbandonProcessGroup</key> 
<true/> 

... aber den Nachteil hat, dass launchd nicht erkennt, gibt es einen Hintergrundprozess über links, und unter bestimmten Umständen kann es versuchen, den Job wieder zu laufen, in zwei resultierenden (oder mehr) Hintergrundprozesse ...

+0

Wow danke Mann !! Ich verstehe Sie, aber was ist, war zwei verschiedene Befehle anstelle von Dateien und der erste Befehl wäre auch ein Befehl, der nie endete, bis der Benutzer den Befehl manuell beendet hat, könnten Sie tun, würden Sie zwei erstellen zwei verschiedene Plisten? Danke, Mann! –

+0

Und hast du nicht zwei Escape-Zeichen wie & mit '&'? –

+0

@SUhost: Ups, ja ich das '&' muss codiert werden; Ich werde es reparieren. Was die andere Frage betrifft ... Ich müsste mehr darüber wissen, was Sie erreichen wollen, was die Programme sind und wie sie zueinander stehen, um eine Empfehlung abzugeben.Übrigens, da die Befehle im Wesentlichen zur gleichen Zeit ausgeführt werden, welcher Befehl "erster" ist, spielt das keine Rolle, oder? –

Verwandte Themen