Комментарий пользователя chepner о непосредственной проблеме: вы передаете имена скриптов, чтобы ошибиться. После опции -c
bash ожидает один аргумент, содержащий исполняемую команду (необязательно, после чего следует передать аргументы, начиная с $0
). Если вы хотите выполнить несколько команд, вам необходимо объединить их в одну составную команду, например /Users/qwe/Music/meta.sh & /Users/qwe/Music/seta.sh
.
Но я думаю, что вы также используете launchd wrong. Launchd действительно предназначен для запуска процессов, а затем для их мониторинга; это требует, чтобы они оставались на переднем плане. Вещи, которые выходят за рамки запуска, как правило, путают его, приводя к странным проблемам. Например, рассмотрим приведенную выше командную строку. Он запускает meta.sh в фоновом режиме и seta.sh на переднем плане. Вы сказали, что meta.sh - это долговременный процесс, но я полагаю, что seta.sh просто выполняет свою работу и выходит? Если да, то startd увидит, что завершен процесс seta.sh (процесс переднего плана), что любые подпроцессы (meta.sh) остаются оставшимися сиротами и должны «очищать их», т. Е. Убивать их. К сожалению, meta.sh больше не работает.
Если вы действительно хотите, чтобы запускались как meta.sh, так и seta.sh, было бы лучше создать для них два отдельных элемента запуска (т. Е. Два файла .plist).
Если вам нужно запустить их по какой-либо причине, возможно, лучшим способом является создание небольшого скрипта, который запускает оба из них , а затем ждет выхода из и передает этот «скрипт» в bash as параметр -c
. Обратите внимание, что это означает, что весь «сценарий» должен быть в одном string
в ProgramArguments
массиве:
<key>ProgramArguments</key>
<array>
<string>bash</string>
<string>-c</string>
<string>/Users/qwe/Music/meta.sh & /Users/qwe/Music/seta.sh; wait</string>
</array>
Другая возможность добавить AbandonProcessGroup
ключ к .plist, а не «сценарий» ждать для фонового процесса, чтобы закончить:
<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/>
... но это имеет тот недостаток, что не запуск программ реализации есть фоновый процесс остался, и при определенных обстоятельствах он может попытаться выполнить задание снова, в результате чего два (или более) фоновых процессов ...
'seta.sh' не запускается, а не потому, что' meta.sh' никогда не выходит, а потому что это просто еще один аргумент 'bash', специально используемый для установки значения' $ 0', видимого 'meta.sh' , – chepner
Итак, что бы вы сделали, если meta.sh была бесконечной командой? Но seta все еще был файлом –