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 & /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 & /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 ...
'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
Was würden Sie tun, wenn meta.sh ein nie endender Befehl wäre? Aber Seta war immer noch eine Datei –